Ruby Integer的正则表达式

时间:2016-09-24 02:51:24

标签: ruby regex

Ruby整数被编写为使用可选的前导符号,可选的基本指示符(对于八进制为0,对于十六进制为0x,对于二进制为0b),后面是相应基数中的一串数字。数字字符串中将忽略下划线字符。上面描述中提到的字母可以是大写或小写,下划线字符只能严格地出现在数字字符串中。

我需要使用上面提到的规范创建正则表达式来检查java字符串中的Ruby整数。

2 个答案:

答案 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一样,我假设你的字符串有空格。没有空格你仍然会得到一个结果,但它可能不是你想要的,但至少它是一个开始。