如果$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 '
答案 0 :(得分:3)
在您的特定情况下,非贪婪的.*
将起作用。那就是:
(.*?)xyz(.*?)xyz
会为您提供所需内容,如http://rubular.com/r/RtaMG6ZvWK
所示然而,正如下面@ikegami的评论所指出的,这是一种脆弱的方法。事实证明是与基于字符的[^...]
结构相对应的“字符串”,如@ ikegami的答案所示https://stackoverflow.com/a/20367916/1008891
答案 1 :(得分:3)
(?:(?!STRING).)*
是STRING
,[^CHAR]*
是CHAR
。
(实际上,不仅仅是字符串可以这种方式使用。例如,您可以使用STRING1|STRING2
和STRING
一样。)
$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);
}
}