正则表达式,可选地匹配字符串的开头

时间:2011-09-28 20:22:27

标签: regex

我有一个包含可能由正则表达式“[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”但结果是一样的。

你知道问题可能是什么吗?

2 个答案:

答案 0 :(得分:1)

使用外观,您可以找到不在另一个数字旁边的数字:

(?<![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")

答案 1 :(得分:0)

使用GNU sed,您可以尝试:

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

HTH