【发布时间】:2021-05-01 09:58:59
【问题描述】:
我的用户给出了一个带有量词的正则表达式,这些量词默认为贪婪。他可以给出任何有效的正则表达式。所以解决方案必须处理用户可以扔给我的任何东西。
如何转换正则表达式,使任何贪婪的量词都是非贪婪的?
Perl 是否有一个 (?...:regexp) 构造,它将量词的贪婪默认值强制为非贪婪默认值?
如果不是:有没有其他方法可以将带有贪婪量词的正则表达式强制转换为非贪婪量词?
例如,用户可以输入:
.*
[.*]
[.*]{4,10}
[.*{4,10}]{4,10}
虽然这四个例子看起来很相似,但它们的含义却完全不同。
如果您只是在每个*/} 之后添加?,您将更改最后三个示例中的字符集。
相反,它们应该更改为/行为如下:
.*?
[.*]
[.*]{4,10}?
[.*{4,10}]{4,10}?
但是匹配的字符串是最小匹配,而不是第一个匹配,Perl 将默认为:
$a="aab";
$a=~/(a.*?b)$/;
# Matches aab, not ab
print $1;
但是考虑到非贪婪的正则表达式,最小匹配可能可以通过添加.*来获得:
$a="aab";
$a=~/.*(a.*?b)$/;
# Matches ab
print $1;
【问题讨论】:
-
也许您应该询问特定的正则表达式或量词。
-
看起来不难,是吗? perlre 中“贪婪”的第二个结果回答了您的问题
-
@TLP 问题是正则表达式是由 the user 给出的!我无法控制他们输入的内容,所以我需要一种使用 any 正则表达式的方法。例如。他们很可能会输入:'[(?:.*)]',它不包含任何量词,但看起来是这样 - 相反它是一个字符集。
-
@ikegami 它确实不回答了这个问题。如果您不明白为什么,请重新阅读问题。您的参考文献列出了非贪婪量词。它没有显示将贪婪正则表达式转换为非贪婪正则表达式的一般方法。如问题所示,将
?添加到每个*的天真方法将不起作用。 -
“将贪婪的正则表达式强制转换为非贪婪的构造” 这是否存在于 any 正则表达式风格中?我从来没有听说过。此外,正如 TLP 所说,这 99% 是 XY 问题。更改用户的模式以匹配与他们想要匹配的内容不同的内容,您究竟能获得什么?