我正在寻找一个正则表达式模式,该模式与包含 XYZ
的任何单词相匹配,并且不以冒号 :
开头。
例如,我想仅从 This isXYZ a :exampleXYZa
匹配 isXYZ
。
我的第一个想法是使用这个正则表达式模式:
/(?<!\:[^\s\r\t\n])XYZ/
基本上,是一个负向后查找,以确保事先不存在没有空格的冒号。然而,这不起作用,因为 lookbehind assertion must be fixed length .
编辑:我也希望有 utf8 支持。
最佳答案
您可以使用如下所示的正则表达式:
/\b((?<!:)\w*XYZ\w*)\b/ui
\b
before 和 after 只是匹配单词边界。在
((?<!:)\w*XYZ\w*)
,我们检查任何包含XYZ
的单词其中,前面有零个或多个字符,后面有零个或多个字符。借助负向回顾(?<!:)
,我们确保它前面没有:
.正如 @unclexo 在评论中提到的,您可以添加
u
末尾的修饰符支持 UTF-8 序列匹配。 See here for more info .您还可以添加
i
不区分大小写匹配的标志。
片段:
<?php
$tests = [
'This isXYZ a :exampleXYZa',
'isXYZ a :exampleXYZa abcXYZ',
'isXYZ a :exampleXYZXYZa abcXYZ',
'XYZ',
'XYZjdhf',
'This isXYZ a example:XYZa',
'äöüéèXYZ :äöüéèXYZäöüéè'
];
foreach($tests as $test){
if(preg_match_all('/\b((?<!:)\w*XYZ\w*)\b/ui',$test,$matches)){
print_r($matches[0]);
}
}
关于php - 匹配包含 "XYZ"并且不以冒号开头的单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59906696/