【问题标题】:Is there a regular expression to find two different words in a sentence?是否有一个正则表达式可以在一个句子中找到两个不同的单词?
【发布时间】:2010-10-05 22:28:13
【问题描述】:

是否有正则表达式可以在一个句子中找到两个不同的单词?在 MS Visual Studio 2008 中工作的表达式的额外功劳:)

例如:

reg_ex_match(A, B, "A sentence with A and B") = true
reg_ex_match(C, D, "A sentence with A and B") = false

另见此相关question

【问题讨论】:

  • 试着给出一个完整的例子来说明你想要发生的事情?您需要的是 OR 还是 AND? A、B、C 和 D 中允许的字符范围是多少?
  • “单词”到底是什么意思?由空格字符分隔或在字符串开头或结尾的序列?

标签: visual-studio regex string search find


【解决方案1】:

真实的话:

\bA\b.+\bB\b|\bB\b.+\bA\b

【讨论】:

  • 我想这取决于OP的“单词”是什么意思。而且,你表达的后半部分是双 B。
  • 另外,请注意单词边界可能不是您想要的。对 OP 来说,“A-B”每次是一个词还是两个词?例如:姓氏有时会连字符。
【解决方案2】:

".*A.*B.*|.*B.*A.*" 如果需要正确的单词,可以在单词 A 和 B 周围添加空格。

【讨论】:

  • 小心。这将匹配“带有 AB 的句子”。不过,关闭。
  • 这将是一种正确的行为如果您将一个单词定义为一个单独的单词,那么正如我所说,您应该在周围添加空格。
  • 空格不会删减它,因为一个单词可能在字符串的开头或结尾。在这种情况下,它仍应被视为一个单独的单词,但在它之前/之后没有空格。请参阅使用 \b 的@Gumbos 解决方案以获得“真实”解决方案。
  • 注意单词边界。我已经看到很多人因为没有意识到他们在数据集中的某些“单词”包含的字符不在他们使用的正则表达式的“风味”的边界定义中而被咬伤。
  • 这也将匹配 AUTOBAHN 或 BAILOUT,因为 .* 还将匹配围绕或位于 A 和 B(或 B 和 A)之间的单词字符。它甚至可以匹配类似“并且在过马路之前一定要向两边看。”
【解决方案3】:

为什么不使用布尔逻辑,而不是复杂的正则表达式?

代码未测试:

public bool reg_ex_match(Regex A, Regex B, string s) {
    return A.isMatch(s) && B.isMatch(s);
}

更新:假设 A 和 B 是用单词边界定义的:

Regex A = new Regex(@"\bA\b");

【讨论】:

  • 如果 A="foo" 和 B="foomator" 这不起作用,那么它将为“this is foomator”返回 true。
【解决方案4】:

.*A.*\s.*B.*|.*B.*\s.*A.*

请注意在 A 和 B 之间使用“+”。这是为了确保您在单独的 A 和 B 上匹配。如果这不是必需的,那么 Łukasz Lew 的答案是正确的。

更新:根据下面 Bryan 的出色观察进行了更改。上面的表达式将识别 A 与 B 分开(反之亦然),在两个感兴趣区域之间至少有一个空白字符(空格、制表符或换行符)。

【讨论】:

  • 假设句子没有被换行符分割。 (因为这与“。”不匹配)
  • 你的意思可能是 .*A.+B.*|.*B.+A.*
  • 并非如此。这是正确的正则表达式语法,尽管它可能需要适应您在其中使用它的任何环境......
  • 我的意思是你需要“\”才能让*出现在你的答案中:)
  • 如果您正在谈论防止星号被解释为标记,正确的方法是将文本包含在backticks 中,或者将其放在单独的行中,缩进四个空格。
【解决方案5】:

正则表达式

以下正则表达式匹配整个字符串,仅当字符串包含所有单词时:all your words here。您可以轻松添加其他单词或删除现有单词。

(?=.*?\ball\b)
(?=.*?\byour\b)
(?=.*?\bwords\b)
(?=.*?\bhere\b)
.*

没那么复杂。

【讨论】:

    【解决方案6】:

    您正在寻找的正则表达式是这样的:

    /word1.*(?=word2)|word2.*(?=word1)/igm
    

    这也是不区分大小写,可以应用于多行的文本。

    http://regexr.com/ 测试过

    【讨论】:

      【解决方案7】:

      尝试搜索regexlib,一个正则表达式存储库。

      【讨论】:

      • 这是个坏建议。该网站上正则表达式的质量无处不在,几乎不存在同行评审。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-23
      • 1970-01-01
      • 2015-07-26
      • 1970-01-01
      • 1970-01-01
      • 2013-09-14
      相关资源
      最近更新 更多