正则表达式等价

时间:2013-12-04 02:02:50

标签: regex perl

如果$string=~/[^x]/被多字符字符串x替换,那么xyz的正则表达式相当于什么?即字符串不包含xyz

我最终想要匹配

$string = 'beginning string xyz remaining string which doesn't contain xyz';
使用

$string =~/(<pattern>)xyz(<pattern>)xyz/

这样

$1 = 'beginning string '
$2 = ' remaining string which doesn't contain ' 

3 个答案:

答案 0 :(得分:3)

在您的特定情况下,非贪婪的.*将起作用。那就是:

(.*?)xyz(.*?)xyz

会为您提供所需内容,如http://rubular.com/r/RtaMG6ZvWK

所示

然而,正如下面@ikegami的评论所指出的,这是一种脆弱的方法。事实证明与基于字符的[^...]结构相对应的“字符串”,如@ ikegami的答案所示https://stackoverflow.com/a/20367916/1008891

您可以在http://rubular.com/r/zsO1F0nkXu

的rubular中看到这一点

答案 1 :(得分:3)

(?:(?!STRING).)*STRING[^CHAR]*CHAR

(实际上,不仅仅是字符串可以这种方式使用。例如,您可以使用STRING1|STRING2STRING一样。)

$string =~ /
    ( (?:(?!xyz).)* )
    xyz
    ( (?:(?!xyz).)* )
    xyz
/sx

如果匹配,那么它将始终在零位置匹配,所以让我们锚定它以防止在失败时不必要的回溯。

$string =~ /
    ^
    ( (?:(?!xyz).)* )
    xyz
    ( (?:(?!xyz).)* )
    xyz
/sx

答案 2 :(得分:0)

while (<>) {
    if (/(([^x]|x(?!yz))+)xyz(([^x]|x(?!yz))+)xyz/) {
      printf("'%s' '%s'\n", $1, $3);
    }
}