【问题标题】:Regex that matches two sentences varying by one word匹配两个不同单词的句子的正则表达式
【发布时间】:2017-06-28 19:26:50
【问题描述】:

我正在寻找一个匹配这两个示例的正则表达式:

Hello I am really him.

Hello I am him.

一般来说,你如何设置一个正则表达式来匹配一个字符串,以及该字符串中缺少一个单词的子集?

更新

所以这只是一个例句,看看我是否可以在我的实际字符串上重现相同的模式。然而,这并不完全奏效,所以他们在这里。 我需要匹配句子:

Ulcerative colitis patient, biopsy taken from the descending colon, macroscopic inflammation vissible

descending 这个词可能出现也可能不出现,no 这个词可能出现在最后一个逗号之后。所以它可能是:

Ulcerative colitis patient, biopsy taken from the descending colon, macroscopic inflammation vissible

Ulcerative colitis patient, biopsy taken from the descending colon, no macroscopic inflammation vissible

Ulcerative colitis patient, biopsy taken from the colon, macroscopic inflammation vissible

Ulcerative colitis patient, biopsy taken from the colon, no macroscopic inflammation vissible

【问题讨论】:

  • 类似Hello I am(?: really)? him.
  • 我不明白这篇文章。我以为您将原始示例用作某种模板,而不是逐字逐句的文本、间距和大写字面句子。文本中没有什么是静态的!你最好使用几个单词文字穿插.*? 来获得匹配。
  • @sln 在大多数情况下它是静态的。唯一改变的是descendingno这两个词的存在(或不存在)
  • 如果是一个句子,那很好,但如果它是多个不同的句子,你就很难过。
  • 注意错字:“vissible”应该是“visible”。

标签: regex match pcre


【解决方案1】:

对于这个例子,你会想使用“?”表示一个可选项目。此外,您还需要使用“()”同时使多个字符成为可选字符。

这是正则表达式(具体语法可能会因您的程序而略有不同):

/Hello I am (really )?him/

egrep 的示例语法:

echo "Hello I am him" | egrep "Hello I am (really )?him"
echo "Hello I am really him" | egrep "Hello I am (really )?him"

使用 sed 的示例语法:

echo "Hello I am him" | sed "s/Hello I am \(really \)\?him//"

【讨论】:

    【解决方案2】:
    Hello I am (\w*\s?)him.
    

    你可以测试一下here

    在问题更新后使用实际字符串和所有测试用例进行编辑:

    Ulcerative colitis patient, biopsy taken from the(\s?\w*\s?)colon,(\s?\w*\s?)macroscopic inflammation vissible

    这些可以通过以下 regex101 链接进行验证:regex101.com/r/4QRJDx/3

    【讨论】:

    • 这会再次起作用吗?例如,匹配 Hello I am him.Hello I am really him.Hello I am really him again. 正则表达式可以是 Hello I am (\w*\s?) him (\w*\s?). 因为当我在我的句子上测试它时,它似乎不起作用。
    • 不,当然,如果缺少的单词位于句尾,我的解决方案将不起作用。我也没有从你的问题中得到这个测试用例
    • @KyleWeise 你应该在第二种情况下反转 \w 和 \s 。试试这个:Hello I am (\w*\s?)him(\s?\w*). 我更新了 regex101 链接:regex101.com/r/4QRJDx/2 它也匹配附加的测试用例
    • @KyleWeise Ulcerative colitis patient, biopsy taken from the(\s?\w*\s?)colon,(\s?\w*\s?)macroscopic inflammation vissible ... 验证链接:regex101.com/r/4QRJDx/3
    • 在正则表达式调试器中,是的。但由于某种原因不在我的代码中。我还在摆弄它。这是一个很好的方向,虽然谢谢
    【解决方案3】:

    使单词“really”和以下空格可选:

    /Hello I am (?:really )?him\./
                ^         ^           group
                 ^                    non-matching
                           ^          make the whole group optional
                               ^      escape the '.' so it only matches a literal '.'
    

    Demo

    【讨论】:

      【解决方案4】:

      现有答案涵盖了对问题最明显、最自然的解读。

      但出于兴趣,另一种解释可能是:与第一个相比,如何匹配两个句子的序列,其中第二个句子最多缺少一个单词?

      在这种情况下,您正在查看以下内容:

      (\w+\b\s*)*?(?:\w+\b\s*)(\w+\b\s*)*[.?!]+\1\2[.?!]
      

      三个单词序列(零个或多个;一个;以及零个或多个);句末标点;那么只有第一个和最后一个单词序列。

      不过,效率可能会有所提高。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-12-29
        • 2014-11-22
        • 2013-01-23
        • 1970-01-01
        • 1970-01-01
        • 2022-11-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多