【问题标题】:Regex: Extract and Match Specific words In between two characters正则表达式:提取和匹配两个字符之间的特定单词
【发布时间】:2017-07-18 09:48:08
【问题描述】:

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

示例字符串:
1. 万都 GRA 曼迪工厂路外的 Yeet 路。
2. 3A, Sleek Drive, Off Tremble Rake Street。
3. 57 Radish Slist Road Ikoyi

结果应尽可能接近:

  1. 夜路
  2. 曼迪植物路
  3. 颤抖的雷克街
  4. 萝卜 Slist 路伊科伊

根据一些堆栈答案,这是我目前拥有的:
(?<=\,)(.*Way|Road|Str|Street?)(?=\,)

任何帮助将不胜感激。

【问题讨论】:

标签: php regex


【解决方案1】:

你可以尝试这样的事情(带有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|...)

此外,您需要更准确地确定单词之间允许或不允许哪些字符。

【讨论】:

    【解决方案2】:

    你可以考虑使用

    ^\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+ 个字符,整个子模式在单词边界内匹配以避免匹配前导/尾随标点符号/空格。

    【讨论】:

    • 效果很好,谢谢。但与@casimir-et-hippolyte 答案不同,没有删除“关闭”。虽然他的速度有点慢但更准确。
    • @JonathanItakpe 随意接受最适合您的那个。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-15
    相关资源
    最近更新 更多