Ruby整数被编写为使用可选的前导符号,可选的基本指示符(对于八进制为0,对于十六进制为0x,对于二进制为0b),后面是相应基数中的一串数字。数字字符串中将忽略下划线字符。上面描述中提到的字母可以是大写或小写,下划线字符只能严格地出现在数字字符串中。
我需要使用上面提到的规范创建正则表达式来检查java字符串中的Ruby整数。
答案 0 :(得分:3)
我假设可能表示整数的子串用空格分隔或者开始或结束字符串。如果是这样,我建议你在空格上拆分字符串,然后使用方法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
的内联救援处理了这个问题,但您可能希望编写它以便只获得该异常。在执行上述方法之前,可以谨慎地删除字符串中的标点符号。
答案 1 :(得分:0)
这个正则表达式以denary,binary,octal和hexidecimal形式捕获正数或负数,包括任何下划线:
# 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上的()
我已经使用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"]
捕获的内容你可以更容易地看到匹配,但它基本上是相同的正则表达式。)
以下是使用String#scan
正在执行的正则表达式的示例:
app.CreateScroller(w,h);
与@CarySwoveland一样,我假设你的字符串有空格。没有空格你仍然会得到一个结果,但它可能不是你想要的,但至少它是一个开始。