如何使用正则表达式

时间:2015-06-01 01:00:50

标签: regex

我在文本文件中有多个文本行,我需要提取特定值。我刚刚开始学习RegEx,并试图在这种情况下使用它。要提取的值是数字,但可以是整数或小数,带有不同的小数位。

文本行的两个示例如下所示。

settings parameterName1 = 15.0;
settings parameterName2 = 75.0; # Increase 25% from 50.0;

下面的RegEx字符串适用于第一个文本行,但不适用于第二个文本行。

(?<=\bsettings.*\=\s).*(?=\;)\b

我从RegEx字符串得到的结果如下所示 - 第二行没有输出我正在寻找的数字值(即我预计第一行会看到15.0而第二行看不到75.0而不是得到#comment文本)。

15.0;
75.0; # Increase 25% from 50.0;

非常感谢你的帮助。

3 个答案:

答案 0 :(得分:2)

  

我从RegEx字符串中得到的结果如下所示

这是因为.* 贪婪。当它具有停止匹配或继续匹配的选项时,它将尝试匹配尽可能多的字符。

一个简单的解决方法是将不情愿的限定符?添加到.* - 即

(?<=\bsettings.*\=\s).*?(?=\;)\b

更好的解决方法是将.替换为[^;],这也会阻止回溯:

(?<=\bsettings.*\=\s)[^;]*(?=\;)\b

答案 1 :(得分:0)

我建议使用组而不是lookahead / lookbehind - 正则表达式更简单,更易读。您可以使用以下正则表达式,并选择第二组:

(settings .*= )([^;]*;)

答案 2 :(得分:0)

您可以使用群组匹配而不是后视和前瞻:

/settings.*?=\s*?([\d.]+)/g

然后通过每场比赛的组(1)访问数字。

注意使用惰性量词&#39;?&#39;。您可以在此处阅读延迟量词 - http://www.rexegg.com/regex-quantifiers.html#lazy_solution