2011-10-12 138 views
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}选项的空白?

回答

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 
+0

谢谢你的工作:) 你能帮助改变数字之前的空白的正则表达式吗?我测试过这个\ b(?:(\ s | \ d)[\ s \ d] {0,2})(?:(?<= \ d)| \ b)但它并不完美,因为字边界不能正常工作:/ – corvus

+0

这应该这样做:'\ b(?:[\ d \ s] {0,2} \ d)( ?:(?<= \ s)| \ b)' – morja

+0

是的,这是有效的。谢谢 :) – corvus

0

这是做你想做的吗?

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

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

0

我想你想这

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

看到它here on Regexr

字边界不会在结束工作,因为如果比赛结束时是一个空白,没有单词边界。因此,我使用负向前视(?!\d)以确保没有数字跟随。

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

+0

谢谢你的提示regexr。这真的很酷测试正则表达式:) – corvus

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)