【问题标题】: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" --> 匹配但不应该
  • “你的电话已准备好”-->目前不匹配,不应该

建议?

【问题讨论】:

  • 我正在使用 Elasticsearch
  • 这可能是我似乎无法让它工作

标签: 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]+$/
    

    我认为你需要这个正则表达式。

    【讨论】:

      猜你喜欢
      • 2012-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-02
      • 2021-04-27
      • 1970-01-01
      相关资源
      最近更新 更多