无法让 Perl 正则表达式变得非贪婪
无论我做什么,我的正则表达式都会匹配该行中的最后一组字母字符。我希望它只匹配第一次出现的情况。
我尝试过使用非贪婪运算符,但它顽固地匹配最右边的一组字母字符,在本例中为 $1 提供值“Trig”,这不是我想要的。我希望 $1 为“02.04.07.06 Geerite”。
代码
elsif ($line =~ /\s(\d{2}\.\d{2}\.\d{2}\.\d{2}\s[[:alpha:]]*?)/)
{
print OUTPUT "NT5 " . $1 . " | | \n";
}
来源
02.04.07.06 Geerite Cu8S5 R 3m、R 3m 或 R 32 Trig
输出
NT2 32 三角 | |
换句话说,我想要这个输出:
NT2 02.04.07.06 Geerite | |
My regex matches the last set of alpha characters in the line, regardless of what I do. I want it to match only the first occurrence.
I have tried using the non-greedy operator, but it stubbornly matches the right-most set of alpha characters, in this case giving $1 the value "Trig", which isn't what I want. I want $1 to be "02.04.07.06 Geerite".
Code
elsif ($line =~ /\s(\d{2}\.\d{2}\.\d{2}\.\d{2}\s[[:alpha:]]*?)/)
{
print OUTPUT "NT5 " . $1 . " | | \n";
}
Source
02.04.07.06 Geerite Cu8S5 R 3m, R 3m, or R 32 Trig
Output
NT2 32 Trig | |
So in other words, I want this output:
NT2 02.04.07.06 Geerite | |
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
如果我将代码更改为
我会得到以下输出:
Making the * non-greedy,单词 Geerite 包含在输出中。
您观察到的输出可能来自 if-elsif-else 树的不同分支。
If I change your code to
I get this output:
Making the * non-greedy, the word Geerite is included in the output.
Your observed output probably comes from a different branch of the if-elsif-else tree.
这应该适合您:
prints:
正则表达式本身:
This should work for you:
prints:
The regex on its own:
使
[[:alpha:]]
贪婪:输出
Make
[[:alpha:]]
greedy:Output
您的正则表达式无法匹配“32 Trig”。一定还有其他问题。
如果我在示例字符串的开头添加一个空格并删除最后一个量词后面的不贪婪的
?
,它将产生您想要的输出。[[:alpha:]]*?
将尽可能少地匹配,因此由于后面没有更多模式,它将匹配 0 个字符。Your regex can't match " 32 Trig". There must be some other problem.
If I add a space at the beginning of your example string and remove the ungreedy
?
after the last quantifier, it will produce the output you want.The
[[:alpha:]]*?
will match as less as possible, so because there is no more pattern following, it will match 0 characters.