如果在字符串中存在沒有前導零的有效數字,如「.5」,「+.5」或「-.5」,那麼如何使用RegExp來匹配這樣的模式,然後添加領先零?如何在適用的情況下添加前導零?
說,
s=".5x-.3/+.74x1.2"
我想這是
0.5x-0.3/+0.74x1.2
,並使用
(?!\d)([+-]?)(?!\d)(\.\d+)
的模式和$10$2
作爲替代品,但爲何它沒有提供正確的事情呢?
PS:我使用VBScript正則表達式引擎在Excel
如果在字符串中存在沒有前導零的有效數字,如「.5」,「+.5」或「-.5」,那麼如何使用RegExp來匹配這樣的模式,然後添加領先零?如何在適用的情況下添加前導零?
說,
s=".5x-.3/+.74x1.2"
我想這是
0.5x-0.3/+0.74x1.2
,並使用
(?!\d)([+-]?)(?!\d)(\.\d+)
的模式和$10$2
作爲替代品,但爲何它沒有提供正確的事情呢?
PS:我使用VBScript正則表達式引擎在Excel
將(?<!\d)\.(?=\d)
替換爲0.
,假設您的正則表達式支持負面後顧。
(?<!\d)
是不是由數字前面(從\D
至極不同將被冠以一個字符不是一個數字和如果字符串與.5
開始將不匹配),非消耗(負向後看)。
\.
是點(duh),消耗。
(?=\d)
表示該點必須是後跟數字,非消耗(正面預測)。
唯一消耗的字符是點,所以你只需要用0.
替換它。
編輯:由於VBScript不支持查找屁股,你可以使用稍微複雜一點的更換(\D|^)\.(?=\d)
與$10.
(假設VBScript的味道不會嘗試獲得第10組,至極的JavaScript似乎沒有這樣做)。 (\D|^)\.
部分將匹配一個以字符串開頭或任何非數字字符開頭的點。前一個字符被消耗,所以你必須把它放回去,因此$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不知道向後看,因此我們必須處理字邊界錨。
這不起作用 - VBScript是一種ECMAScript方言,因此後向斷言不可用,正如我在答案中詳細說明的那樣。 – 2013-03-01 10:25:57
謝謝,相應地編輯了答案。 – 2013-03-01 10:53:05
謝謝大家,讓我知道_lookaround_好了! @ streetpc的代碼是'(\ D | ^)\。(?= \ d)'。 VBScript風格不支持_lookbehind_。必須使用這種方式來解決。 – visualPaul 2013-03-01 22:44:00