代码之家  ›  专栏  ›  技术社区  ›  Adam

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

  •  0
  • Adam  · 技术社区  · 5 年前

    我正在寻找一个匹配任何包含 XYZ : .

    例如,我想匹配来自 This isXYZ a :exampleXYZa 只有 isXYZ .

    我的第一个想法是使用这个regex模式:

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

    基本上,是一个否定的lookbehind,以确保事先没有没有没有空格的冒号。但是,这不起作用,因为 lookbehind assertion must be fixed length

    编辑:我也想有utf8支持。

    1 回复  |  直到 5 年前
        1
  •  2
  •   nice_dev    5 年前

    您可以使用如下正则表达式:

    /\b((?<!:)\w*XYZ\w*)\b/ui
    
    • \b

    • ((?<!:)\w*XYZ\w*) ,我们检查是否有 XYZ (?<!:) ,我们确保它前面没有 :

    • 如所述 @不洁 在注释中,可以添加 u 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]);
        }
    }
    

    https://3v4l.org/Y8SMj