2011-09-28 142 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