2011-10-12 95 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)