【问题标题】:regex match strings with specific string at nth to last word正则表达式将字符串与第 n 个到最后一个单词的特定字符串匹配
【发布时间】:2016-03-17 01:52:21
【问题描述】:
我正在尝试将字符串与“第 n 个”处的特定字符串匹配到最后一个单词。
在这种情况下,在倒数第二个单词中包含字符串“call”的单词。
我尝试过的最成功的事情:
/.*(?=.*call.*)(\w+)\s(\w+)$/
我得到的响应和我在寻找什么:
- "a phone call she" --> 应该返回 --> "a phone call she"
- “他们正在调用”--> 应该返回 --> “他们正在调用”
- "you should call" --> 匹配但不应该
- “你的电话已准备好”-->目前不匹配,不应该
建议?
【问题讨论】:
标签:
regex
regex-lookarounds
【解决方案1】:
您的主要问题是您使用的是前瞻(?=...),这使事情变得混乱。这与您的正则表达式相匹配,然后必须后跟单词call。也许您打算使用非捕获组:(?:...)?
/.*(?:.*call.*)(\w+)\s(\w+)$/
您实际上并不需要它,因为未分组的东西也不会捕获:
/.*call.*(\w+)\s(\w+)$/
在您更改后,您遇到的问题是“呼叫”后您正在匹配
"任意次数后跟 1 个或多个单词字符后跟空格和 1 个或多个单词字符的任意字符"。
那会匹配:
只要后面有两个就可以用很多单词调用
但不是:
打电话给我
因为通话后至少不会有两个字。
我认为您想匹配以“call 后跟任意数量的单词字符、空格和任意数量的单词字符”结尾的字符串:
/.*call(\w*)\s(?:\w+)$/
如果您确实想匹配“呼叫”和后续单词,您可以根据需要更改捕获/非捕获组。
Here's an example
【解决方案2】:
如果我理解正确,您不需要使用前瞻/后视...
你只需要正则表达式来检查你是否有东西然后“调用”,然后最终是别的东西,然后是空格,然后是另一个单词和字符串的结尾。
/.*call[^\s]*\s[A-Za-z]+$/
我认为你需要这个正则表达式。