2013-03-01 75 views
0

如果在字符串中存在沒有前導零的有效數字,如「.5」,「+.5」或「-.5」,那麼如何使用RegExp來匹配這樣的模式,然後添加領先零?如何在適用的情況下添加前導零?

說,

s=".5x-.3/+.74x1.2" 

我想這是

0.5x-0.3/+0.74x1.2 

,並使用

(?!\d)([+-]?)(?!\d)(\.\d+) 

的模式和$10$2作爲替代品,但爲何它沒有提供正確的事情呢?

PS:我使用VBScript正則表達式引擎在Excel

回答

1

(?<!\d)\.(?=\d)替換爲0.,假設您的正則表達式支持負面後顧。

(?<!\d)不是由數字前面(從\D至極不同將被冠以一個字符不是一個數字和如果字符串與.5開始將不匹配),非消耗(負向後看)。

\.是點(duh),消耗。

(?=\d)表示該點必須是後跟數字,非消耗(正面預測)。

唯一消耗的字符是點,所以你只需要用0.替換它。


編輯:由於VBScript不支持查找屁股,你可以使用稍微複雜一點的更換(\D|^)\.(?=\d)$10.(假設VBScript的味道不會嘗試獲得第10組,至極的JavaScript似乎沒有這樣做)。 (\D|^)\.部分將匹配一個以字符串開頭或任何非數字字符開頭的點。前一個字符被消耗,所以你必須把它放回去,因此$1

+1

這不起作用 - VBScript是一種ECMAScript方言,因此後向斷言不可用,正如我在答案中詳細說明的那樣。 – 2013-03-01 10:25:57

+0

謝謝,相應地編輯了答案。 – 2013-03-01 10:53:05

+0

謝謝大家,讓我知道_lookaround_好了! @ streetpc的代碼是'(\ D | ^)\。(?= \ d)'。 VBScript風格不支持_lookbehind_。必須使用這種方式來解決。 – visualPaul 2013-03-01 22:44:00

1
\B\. 

只有當它不是一個數字(或字母),這應該對你的要求之前的工作點相匹配。用0.代替

爲什麼你的正則表達式不工作?好了,它說

(?!\d) # Make sure the next letter isn't a digit 
([+-]?) # Try to match a sign (which never is a digit, so why the lookahead?) 
(?!\d) # Make sure the next letter isn't a digit (again) 
(\.\d+) # Match a dot and digits (the dot also isn't a digit, so again 
     # the lookahead is not necessary) 

所以,你可以完全放下第一先行,第二先行必須是一個回顧後做你想要它做的事情(即斷言,性格之前,點不是數字),但ECMAScript不知道向後看,因此我們必須處理字邊界錨。

+0

是不是'\ D'「只是一個數字」? – Simon 2013-03-01 09:52:12

+1

@Simon,它是'\ B'「不是[單詞邊界](http://www.regular-expressions.info/wordboundaries.html)」,否定'\ b'而不是'\ D' – stema 2013-03-01 09:53:30

+1

這是否在'.5x.5'上失敗,因爲'.'前面是一個字母?似乎'x'在這裏用於乘法。 – Tim 2013-03-01 22:07:57

相關問題