字符串填充可选空白,最大长度

时间:2011-10-12 09:36:42

标签: regex padding optional

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

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

这些数字有时用空格填充到最大长度(3)。 e.g:

  • “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 个答案:

答案 0 :(得分:0)

这样做你想要的吗?

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

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

答案 1 :(得分:0)

我想你想要这个

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

here on Regexr

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

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

答案 2 :(得分: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

答案 3 :(得分:0)

假设您想在其他地方使用填充数字,请将问题分成两部分; (简单)解析数字,并(简单)格式化数字(包括填充)。

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

可替换地:

@padded_numbers = map { sprintf( "%-3d", $_ ) } ( $text =~ /\b(\d{1,3})\b/g )