正则表达式:在行结束时停止匹配

时间:2014-03-23 16:18:00

标签: regex ruby-2.0

我想扫描由线组成的文本。当我识别出一个关键字时,我正在为这种类型的线使用正则表达式。

我的文字有这样的形式:

text<eol>
...
Function1 parameter1 value1, parameter2 value2, .... parameterN value N<eol>
...
text<eol>

在这种情况下,当我识别“Function1”时,我使用这个正则表达式:

(?:(\w+)\s|\G(?<!^))[ ]*(\S+[ ]+\S+)\s*,?

$1 = the keyword Function1
$3 = parameterx valuex

我想在找到行尾时停止匹配。

while mytext =~ /.../ do
 case $3
  when 'parameter1 value1'
   ...
 end #case
 $'
end #while

当匹配接近行尾时,我的代码是正确的:我的正则表达式捕获下一行的一部分。

问题是:我可以在正则表达式中添加什么来在行结束时停止? 我想我必须在某处添加$?

注意: 对不起,我复制了错误的正则表达式([]给了我一个错误的Ruby 2.0)。 注意第一颗星之前的空间!

(?:(\w+)(\s+)|\G(?<!^)) *(\S+\s+\S+)\s*,?

3 个答案:

答案 0 :(得分:1)

要在行尾停止匹配,首先应确保dotall flag未激活。

如果是正则表达式

(?:(\w+)\s|\G(?<!^))[ ]*(\S+[ ]+\S+)\s*,?

正在为您工作,然后只需添加start(^)和/或行尾($)边界,例如:

^(?:(\w+)\s|\G(?<!^))[ ]*(\S+[ ]+\S+)\s*,?$

但似乎您的目标是首先找到一个带有函数签名的行并捕获函数名称。首先,您需要将整行与

匹配
^(\w+)\s+(?:(?:\w+\s+\w+)(?:, *)?)+$

Regular expression visualization

Debuggex Demo

(函数名称位于捕获组1中。)

然后,从函数名后面的第一个非空白字符开始,用

遍历每个参数
\b(\w+)\s+(\w+)\b

Regular expression visualization

Debuggex Demo

答案 1 :(得分:1)

好的,既然你要求它,那就是:

(?:(\w+) +|(?!^)\G) *(\S+ +[^\n, ]+) *,?

我将所有\s更改为空格,将最后\S更改为[^\n, ],以便在匹配期间不会消耗值之后的逗号。

我对捕获组以及您对^锚点\G的否定方式做了一些小改动。

它在this demo site上正在使用PCRE风格的正则表达式,但就像我说的那样,我并不完全确定\G适用于Ruby。如果有人能证实这一点会很高兴。

答案 2 :(得分:0)

不确定特定于ruby的正则表达式。但我认为,添加[^<eol>]应该有助于排除新行。试试这个简单的改变:

(?:(\w+)(\s+)|\G(?<!^)) *(\S+\s+\S+)\s*[^<eol>],?