2011-09-28 113 views
2

我有一個文本包含可能由正則表達式「[1-9]?[0-9]。[1-9]?[0-9 ]。[1-9]?[0-9]。」正則表達式,可選地匹配字符串的開頭

不,我想執行定期更換,在沒有第一個數字時在每個部件的前面放置一個「0」。例如,字符串「1.10.3」會變成「01.10.03」。

我的問題是,我不知道如何捕獲第一位數字當且僅當第一部分中沒有第二位數字時。使用類似「。?([0-9])[^ 0-9]」的東西即使有另一個也會捕獲第一個數字。所以「12.3.4」會變成「02.03.04」或「102.03.04」。

你有任何想法,如果有任何正則表達式匹配這種情況下?

[編輯:]

我使用VBScript Regexp Object V5.5其supports lookaheads

我試圖使用由the answer of Mark Byers提供的正則表達式:

Set re = New RegExp 
re.Global = True 
re.Pattern = "(?:^|[^0-9])([0-9])(?![0-9])" 
Dim x As String 
x = "1.3.4 string" 
x = re.replace(x, "0$1") 
MsgBox (x) 

遺憾的是這段代碼的結果是「010304串」 - 該點被剝奪。我嘗試修改模式以匹配像「(?:^ | [^ 0-9])([0-9])([。])」這樣的點和空格,然後替換爲「0 $ 1 $ 2」,但是結果是一樣的。

你有什麼想法可能是什麼問題?

+0

您正在使用什麼語言HTH?正則表達式根據語言不同而不同。 –

+0

注意你可以(通常)使用'\ d'來代表'[0-9]'和'\ D'來表示非數字符號。 – DavidEG

+0

@MarkByers:這就是爲什麼我寫「(通常)」;) – DavidEG

回答

1

使用lookarounds你可以找到不相鄰的另一個數字位數:

(?<![0-9])[0-9](?![0-9]) 

而且沒有一個回顧後(因爲它不是由一些流行的正則表達式引擎支持):

(^|[^0-9])([0-9])(?![0-9]) 

在線查看第二個版本:Rubular


更新

試試這個:

re.Pattern = "(^|[^0-9])([0-9])(?![0-9])" 
Dim x As String 
x = "1.3.4 string" 
x = re.replace(x, "$1X$2") 
+0

謝謝,但不幸的是,這在VBA中不起作用。你能否檢查我添加到上述問題的代碼? – muffel

+0

@muffel:嘗試我的更新。注意如果$ 10被解釋爲「組10的值」而不是「組1的值,然後是0」,我使用X而不是0來避免潛在的問題。你可能想先試着讓它和X一起工作,當你有這種排序時,試着看看「$ 10 $ 2」是否有效,如果沒有,找出如何解決它。 –

+0

太棒了,謝謝!這節省了我的一天;) – muffel

0

隨着GNU sed你可以試試:

sed 's/^\(\d\.\)/0\1/;s/\.\(\d\)\./.0\1./g;\.\(\d\)$/.0\1/' INPUTFILE 

相關問題