【问题标题】:how to match multiple words in string using regex?如何使用正则表达式匹配字符串中的多个单词?
【发布时间】:2014-08-18 03:36:06
【问题描述】:

我正在尝试匹配可以出现在字符串中任何位置的 3 个单词:

Win
Enter
Now

字符串中必须存在所有 3 个单词才能作为匹配项返回。但是当所有 3 个单词都存在时,我遇到了匹配问题。

下面是我正在使用的正则表达式:http://regexr.com/39b83

^(?=.*?win)(?=.*?(enter))(?=.*?(now)).*

当所有三个单词都在同一行中时,正则表达式正在工作...当它分布在不同行的整个字符串中时,它无法匹配。

感谢任何指导或帮助。

【问题讨论】:

  • 你有什么问题? (您是在尝试匹配这些词中的任何 个词,而不是所有词吗?)
  • 即使字符串包含所有三个单词,它也不会返回匹配项。
  • 你能举一个你试过的字符串的例子吗?它对我来说很好——即使在 RegExr 上也是如此。
  • 如果这是一件又快又脏的事情,我会运行几个 grep。 grep win filename.txt | grep enter | grep now
  • @minitech,试试这个regexr.com/39b83,我在示例中看不到匹配项...

标签: c# regex regex-lookarounds


【解决方案1】:

由于您不想匹配诸如中心之类的单词(带有单词“enter”),我会使用:

/(\benter\b)|(\bwin\b)|(\bnow\b)/

链接到Fiddler

【讨论】:

  • 抱歉,我遗漏了所有 3 部作品必须存在的要求。
  • @Rick 按什么顺序?如果您不知道顺序,单独运行每个单词会更容易
  • 无特定顺序。我遇到的问题主要是当三个单词不在同一行时,它找不到匹配项......
  • @Rick 我可以知道上述输入字符串的预期输出吗?
  • @Rick 如果您不知道顺序并且想确保所有三个单词都存在,则有 3 个!您必须检查的选项,这不是一个非常复杂的正则表达式 - 只是一个很长的正则表达式。如果您像我在上面评论中建议的那样分别检查每个单词,那么阅读和维护会更容易。
【解决方案2】:

我认为C# 会支持(?s) DOTALL 修饰符。如果是,那么您可以尝试以下正则表达式,

(?i)(?s)win.*?enter.*?now

【讨论】:

  • 抱歉,我遗漏了所有 3 部作品必须存在的要求。
  • @AvinashRaj 如果单词的顺序不同,它将不起作用
  • 正确,因为顺序可能不同,想知道这是否可以通过正则表达式进行,然后以编程方式使用单个模式进行迭代。
  • @AvinashRaj: =) 它有效。如果订单未知并且可能会更改,请考虑您的上述评论,以编程方式迭代是否更好?
  • 如果顺序未知,可以使用(?i)(?s)(?:win|enter|now).*?(?:win|enter|now).*?(?:win|enter|now),但也可以匹配win foo win foo bar win
【解决方案3】:

怎么样...

/(win|enter|now)/gi

【讨论】:

  • 抱歉,我遗漏了所有 3 部作品必须存在的要求。
【解决方案4】:

听起来您想匹配出现这些单词的行,最多三行。这并不容易,但是:

/^.*win.*(?:\s+.*)?enter.*(?:\s+.*)?now.*|^.*win.*(?:\s+.*)?now.*(?:\s+.*)?enter.*|^.*enter.*(?:\s+.*)?win.*(?:\s+.*)?now.*|^.*enter.*(?:\s+.*)?now.*(?:\s+.*)?win.*|^.*now.*(?:\s+.*)?win.*(?:\s+.*)?enter.*|^.*now.*(?:\s+.*)?enter.*(?:\s+.*)?win.*/igm

should do it.

【讨论】:

    【解决方案5】:

    这是因为点与换行符不匹配。要改变这一点,你必须有办法。首先,使用 s 修饰符(允许点匹配换行符):

    (?s)^(?=.*\bwin\b)(?=.*\benter\b)(?=.*\bnow\b).*
    

    但此功能并非始终可用(例如在 Javascript 中)。第二种方法是将点替换为[\s\S](匹配所有字符的字符类):

    ^(?=[\s\S]*\bwin\b)(?=[\s\S]*\benter\b)(?=[\s\S]*\bnow\b)[\s\S]+
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-12-03
      • 2021-05-23
      • 1970-01-01
      • 2015-08-21
      • 2011-12-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多