0

我有一系列需要通过 RegEx 捕获的 8 位数字。单个空格可以出现在数字之前、之后以及在某些情况下在数字之间。在某些情况下,其他字符会紧随其后。这是最常见的变体,我想将每个变体捕获为12345678

123456789
 12345678
1234567 89S
12345 678 9
123 456789
123456 789

这可能吗?

4

3 回答 3

3

我认为正则表达式如下:

(( )?\d){8}

足以捕获数字 - 然后我将删除空格(在进一步处理之前)作为单独的步骤。


我不确定如何严格解释 OP 的“单个空格”要求,但这就是为什么我将 RegEx 构造为接受 8 位数字,每个数字都可选地以单个空格字符作为前缀。

如果它应该只在有单个空格的情况下匹配,而不是更多,则上述方法有效,而“先去除空白”或“先去除非数字”方法则不会。

如果允许更多空格,则很容易将 更改?为 a*或任何固定的上限。

于 2013-07-10T08:47:45.557 回答
2

这在单个“正则表达式”步骤中是不可能的。如果您愿意,我可以更详细地说,但基本上正则表达式不能“计数”(它只能匹配指定的匹配大小,例如“8 个数字”,但不能匹配“未知数量的字符,其中 8 个是数字”) .

您需要分两个阶段执行此操作 -

  • 首先删除空格。

  • 然后执行正则表达式匹配。

例如,在红宝石中:

thingtomatch = "  12 3456  7899X"
temp = thingtomatch.squeeze(' ').strip  # => temp="1234567899X"
matched_digits = temp.match(/(\d{8}).*/)[1]

(或者,正如其他答案所建议的那样,您可以执行正则表达式匹配,然后从结果中删除空格。)

于 2013-07-10T08:49:10.170 回答
0

你可以做到,但分两步:

首先,删除非数字:

s/[^\d]//g

其次,匹配你的数字:

m/^(\d{8})$/
于 2013-07-10T08:47:02.873 回答