包含“XYZ”且不以冒号开头的匹配词

我正在寻找一个正则表达式模式,该模式匹配任何包含且不以冒号开头的单词。XYZ:

例如,我只想从 匹配 。This isXYZ a :exampleXYZaisXYZ

我的第一个想法是使用这个正则表达式模式:

/(?<!\:[^\s\r\t\n])XYZ/

基本上,负面的查看会确保事先没有空格就没有冒号。但是,这不起作用,因为 lookbehind 断言必须是固定长度

编辑:我也想得到utf8的支持。


BIG阳
浏览 100回答 1
1回答

皈依舞

你可以有一个正则表达式,如下所示:/\b((?<!:)\w*XYZ\w*)\b/ui\b前后只是匹配一个单词边界。在 中,我们检查其中是否有任何单词,并且它前面有零个或多个字符,后面有零个或多个字符。在负向隐藏的帮助下,我们确保它前面没有。((?<!:)\w*XYZ\w*)XYZ(?<!:):正如@unclexo在注释中提到的,您可以在末尾添加修饰符以支持 UTF-8 序列匹配。有关详细信息,请参阅此处。u您还可以添加不区分大小写匹配的标志。i片段:<?php$tests = [&nbsp; &nbsp; &nbsp; &nbsp; 'This isXYZ a :exampleXYZa',&nbsp; &nbsp; &nbsp; &nbsp; 'isXYZ a :exampleXYZa abcXYZ',&nbsp; &nbsp; &nbsp; &nbsp; 'isXYZ a :exampleXYZXYZa&nbsp; abcXYZ',&nbsp; &nbsp; &nbsp; &nbsp; 'XYZ',&nbsp; &nbsp; &nbsp; &nbsp; 'XYZjdhf',&nbsp; &nbsp; &nbsp; &nbsp; 'This isXYZ a example:XYZa',&nbsp; &nbsp; &nbsp; &nbsp; 'äöüéèXYZ :äöüéèXYZäöüéè'&nbsp; &nbsp; ];foreach($tests as $test){&nbsp; &nbsp; if(preg_match_all('/\b((?<!:)\w*XYZ\w*)\b/ui',$test,$matches)){&nbsp; &nbsp; &nbsp; &nbsp; print_r($matches[0]);&nbsp; &nbsp; }}演示:https://3v4l.org/Y8SMj
打开App,查看更多内容
随时随地看视频慕课网APP