0

我在构建正则表达式时遇到问题。这是文本的示例:

text 123 12345 abc 12    def 67 i 89 o 0    t 2

这些数字有时会用空格填充到最大长度 (3)。例如:

  • “1”可以是“1”或“1”
  • “13”可以是“13”或“13”

我的正则表达式目前是这样的:

\b([\d](\s*)){1,3}\b

此正则表达式的结果如下:(.= 空白以获得更好的可见性)

123.
12....
67.
89.
0....
2

但我需要这个:(。=空白以获得更好的可见性)

123
12.
67.
89.
0..
2

如何告诉正则表达式引擎将空格计入 {1,3} 选项?

4

4 回答 4

0

Assuming you want to use the padded numbers somewhere else, break the problem apart into two; (simple) parsing the numbers, and (simple) formatting the numbers (including padding).

while ( $text =~ /\b(\d{1,3})\b/g ) {
  printf( "%-3d\n", $1 );
}

Alternatively:

@padded_numbers = map { sprintf( "%-3d", $_ ) } ( $text =~ /\b(\d{1,3})\b/g )
于 2011-10-12T11:05:00.603 回答
0

尝试这个:

\b(?:\d[\d\s]{0,2})(?:(?<=\s)|\b)

这也将涵盖字符串,例如text 123 1 23 12345 123abc 12 def 67 i 89 o 0 t 2并导致:

123
1.
23.
12.
67.
89.
0..
2
于 2011-10-12T10:33:39.447 回答
0

这是做你想做的吗?

\b(\d){1,3}\s*\b

这还将包括选择后的空格(如果可用)。

于 2011-10-12T09:48:07.873 回答
0

我想你想要这个

\b(?:\d[\d\s]{0,2})(?!\d)

在 Regexr 上查看

单词边界在末尾不起作用,因为如果匹配的结尾是空格,则没有单词边界。因此,我使用负前瞻(?!\d)来确保没有数字跟随。

但是如果你有一个像“1 23”这样的字符串。它将仅匹配“2”和“23”,而不匹配第一个“2”之后的空格。

于 2011-10-12T10:04:21.963 回答