我在文本文件中有多个文本行,我需要提取特定值。我刚刚开始学习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;
非常感谢你的帮助。
答案 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。