Ruby整數的寫法是使用可選的前導符號,可選的基本指示符(0表示八進制,0x表示十六進制,或者0b表示二進制),後面跟着一串適當基數的數字。數字字符串中的下劃線字符被忽略。上述描述中提到的字母可以是大寫或小寫,下劃線字符只能出現在數字字符串中。Ruby整數的正則表達式
我需要創建正則表達式來檢查上述規格的Java字符串中的Ruby整數。
Ruby整數的寫法是使用可選的前導符號,可選的基本指示符(0表示八進制,0x表示十六進制,或者0b表示二進制),後面跟着一串適當基數的數字。數字字符串中的下劃線字符被忽略。上述描述中提到的字母可以是大寫或小寫,下劃線字符只能出現在數字字符串中。Ruby整數的正則表達式
我需要創建正則表達式來檢查上述規格的Java字符串中的Ruby整數。
我假設可能表示整數的子字符串之間用空格分隔或開始或結束字符串。如果是這樣,我建議你將字符串分割爲空白,然後使用方法Kernel#Integer來確定結果數組中的每個元素是否表示一個整數。
def str_to_int(str)
str.split.each_with_object([]) do |s,a|
val = Integer(s) rescue nil
a << [s, val] unless val.nil?
end
end
str_to_int "22 -22 077 0xAB 0xA_B 0b101 -0b101 cat _3 4_"
#=> [["22", 22], ["-22", -22], ["077", 63], ["0xAB", 171],
# ["0xA_B", 171], ["0b101", 5], ["-0b101", -5]]
Integer
引發一個TypeError
例外是數不能被轉換爲整數。我已經通過聯機救援處理了該問題,返回nil
,但您可能希望編寫該救援,以便僅救出該異常。在執行上述方法之前,可能會謹慎地從字符串中刪除標點符號。
此正則表達式捕獲正數或負數的denary,二進制,八進制和十六進制形式包括任何下劃線:
# hexidecimal binary octal denary
-?0x[0-9a-fA-F][0-9a-fA-F_]*[0-9a-fA-F]|-?0x[0-9a-fA-F]|-?0b[01][01_]*[01]|-?0b[01]|-?0[0-7][0-7_]?[0-7]?|-?0[0-7]|-?[1-9][0-9_]*[0-9]|-?[0-9]
您應該全面測試正則表達式,以確保它的工作原理是必須的,但它似乎工作在我嘗試過的一些相關示例上(請參閱Rubular,我已經使用()
捕獲,因此您可以更容易地看到匹配,但它本質上是相同的正則表達式)。
下面是使用String#scan
行動正則表達式的例子:
str = "-0x88339_43 wor0ds 8_8_ 0b1001 01words0x334 _9 0b1 0x4 0_ 0x_ 0b_1 0b00_1"
reg = /-?0x[0-9a-fA-F][0-9a-fA-F_]*[0-9a-fA-F]|-?0x[0-9a-fA-F]|-?0b[01][01_]*[01]|-?0b[01]|-?0[0-7][0-7_]?[0-7]?|-?0[0-7]|-?[1-9][0-9_]*[0-9]|-?[0-9]/
#regex matches
str.scan reg
#=>["-0x88339_43", "0", "8_8", "0b1001", "01", "0x334", "9", "0b1", "0x4", "0", "0", "0", "1", "0b00_1"]
像@CarySwoveland,我假設你的字符串中有空格。沒有空間,你仍然會得到一個結果,但它可能不是你想要的,但至少這是一個開始。
堆棧溢出不是正則表達式順序服務:)你需要分享你的一些工作。 – mertyildiran
@mertyildiran,OP只能描述他或她在家庭作業問題時爲解決問題所做的努力。請記住,許多SO成員今後可能會閱讀這個問題,並從答案中學到一些東西。 –
你的問題還不清楚:你說你「需要創建正則表達式」,那麼爲什麼你不這樣做呢?那麼「檢查Java字符串中的Ruby整數」是什麼意思?您是否在意外地在一段Java代碼中使用Ruby數字文字並且想要找到它們?你在談論一個Java正則表達式嗎? –