我需要从一个字符串中提取出匹配(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
结果应尽可能接近:
基于一些堆栈答案,这是我目前所拥有的:
(?<=\,)(.*Way|Road|Str|Street?)(?=\,)
任何帮助都将不胜感激。
答案 0 :(得分:2)
你可以试试这样的(带有ignore_case标志):
\b(?:(?!off\b)[a-z]+[^\w,\n]+)*?\b(?:way|road|str(?:eet)?)\b(?:[^\w,\n]+[a-z]+)*
然而,这种模式开始在模式的字面部分(关键字)之前描述未定义长度的未定义子字符串,效率不高。这对于小字符串无关紧要,但您不能在大字符串中使用它们。
要排除特定字词,您可以将(?!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+字符,整个子模式在字边界内匹配避免匹配前导/尾随标点/空格。