我想扫描由线组成的文本。当我识别出一个关键字时,我正在为这种类型的线使用正则表达式。
我的文字有这样的形式:
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*,?
答案 0 :(得分:1)
要在行尾停止匹配,首先应确保dotall
flag未激活。
如果是正则表达式
(?:(\w+)\s|\G(?<!^))[ ]*(\S+[ ]+\S+)\s*,?
正在为您工作,然后只需添加start(^
)和/或行尾($
)边界,例如:
^(?:(\w+)\s|\G(?<!^))[ ]*(\S+[ ]+\S+)\s*,?$
但似乎您的目标是首先找到一个带有函数签名的行并捕获函数名称。首先,您需要将整行与
匹配^(\w+)\s+(?:(?:\w+\s+\w+)(?:, *)?)+$
(函数名称位于捕获组1中。)
然后,从函数名后面的第一个非空白字符开始,用
遍历每个参数\b(\w+)\s+(\w+)\b
答案 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>],?