我有一系列需要通过 RegEx 捕获的 8 位数字。单个空格可以出现在数字之前、之后以及在某些情况下在数字之间。在某些情况下,其他字符会紧随其后。这是最常见的变体,我想将每个变体捕获为12345678
:
123456789
12345678
1234567 89S
12345 678 9
123 456789
123456 789
这可能吗?
我有一系列需要通过 RegEx 捕获的 8 位数字。单个空格可以出现在数字之前、之后以及在某些情况下在数字之间。在某些情况下,其他字符会紧随其后。这是最常见的变体,我想将每个变体捕获为12345678
:
123456789
12345678
1234567 89S
12345 678 9
123 456789
123456 789
这可能吗?
我认为正则表达式如下:
(( )?\d){8}
足以捕获数字 - 然后我将删除空格(在进一步处理之前)作为单独的步骤。
我不确定如何严格解释 OP 的“单个空格”要求,但这就是为什么我将 RegEx 构造为接受 8 位数字,每个数字都可选地以单个空格字符作为前缀。
如果它应该只在有单个空格的情况下匹配,而不是更多,则上述方法有效,而“先去除空白”或“先去除非数字”方法则不会。
如果允许更多空格,则很容易将 更改?
为 a*
或任何固定的上限。
这在单个“正则表达式”步骤中是不可能的。如果您愿意,我可以更详细地说,但基本上正则表达式不能“计数”(它只能匹配指定的匹配大小,例如“8 个数字”,但不能匹配“未知数量的字符,其中 8 个是数字”) .
您需要分两个阶段执行此操作 -
首先删除空格。
然后执行正则表达式匹配。
例如,在红宝石中:
thingtomatch = " 12 3456 7899X"
temp = thingtomatch.squeeze(' ').strip # => temp="1234567899X"
matched_digits = temp.match(/(\d{8}).*/)[1]
(或者,正如其他答案所建议的那样,您可以执行正则表达式匹配,然后从结果中删除空格。)
你可以做到,但分两步:
首先,删除非数字:
s/[^\d]//g
其次,匹配你的数字:
m/^(\d{8})$/