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正则表达式吗? –