正则表达式:提取和匹配特定单词在两个字符之间

时间:2017-07-18 09:48:09

标签: php regex

我需要从一个字符串中提取出匹配(way,road,str和street)的单词和之前和之后的每个单词,直到逗号','前面的字符或数字。

示例字符串:
 1. Yeet Road,Mandy Plant Way,Mando GRA  2. 3A,Sleek Drive,Off Tremble Rake Street。
 3. 57 Radish Slist Road Ikoyi

结果应尽可能接近:

  1. Yeet Road
  2. Mandy Plant Way
  3. 颤抖耙街
  4. Radish Slist Road Ikoyi
  5. 基于一些堆栈答案,这是我目前所拥有的:
    (?<=\,)(.*Way|Road|Str|Street?)(?=\,)

    任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:2)

你可以试试这样的(带有ignore_case标志)

\b(?:(?!off\b)[a-z]+[^\w,\n]+)*?\b(?:way|road|str(?:eet)?)\b(?:[^\w,\n]+[a-z]+)*

demo

然而,这种模式开始在模式的字面部分(关键字)之前描述未定义长度的未定义子字符串,效率不高。这对于小字符串无关紧要,但您不能在大字符串中使用它们。

要排除特定字词,您可以将(?!off\b)更改为(?!off\b|word1\b|word2\b|...)

此外,您需要更准确地了解单词之间允许或不允许的字符。

答案 1 :(得分:1)

您可以考虑使用

^\d+\s*(*SKIP)(*F)|\b[^,]*\b(?:way|r(?:oa)?d|str(?:eet)?)\b[^,]*\b

请参阅regex demo

<强>详情:

  • ^\d+\s*(*SKIP)(*F) - 在字符串开头匹配并省略最初的1位或更多位数,然后是0+空格
  • | - 或匹配......
  • \b[^,]*\b(?:way|r(?:oa)?d|str(?:eet)?)\b[^,]*\b - 除了逗号以外的任何0 +字符,然后非捕获组中的任何替代字符作为整个单词,然后再次是除逗号之外的0+字符,整个子模式在字边界内匹配避免匹配前导/尾随标点/空格。