首页 > 解决方案 > 如何创建具有多个条件的 RegEx?

问题描述

我正在通过 RegEx 实验室工作,该实验室要求我:

在“国家”文件中搜索所有包含九个字符和字母 i 的单词。
找到多少个结果?

我正在在线模拟环境中的通用 Linux 命令提示符下工作。我被允许使用grepawk或者sed虽然我感觉偏爱grep.

(当谈到 RegEx 时,我是 100% 的菜鸟,所以像我 5 岁一样向我解释)

根据以前的实验室,我已经使用了类似下面的东西,它找到了所有有 9 个字符的国家,但是我找不到一种方法让它找到所有有 9 个字符并i在任何位置包含字母的单词。

grep -E '\b\w{9}\b' countries

|运算符没有帮助,因为它是一个运算OR符,会找到我找到的所有实例i,以及所有 9 个字符的单词,我需要同时发生。我也尝试了多个grep语句,似乎模拟器可能不接受。

我也试图坚持[]字符集,因为下一个问题要求在 9 个字母的单词中输入多个字母。

标签: regexawksedgreplogical-operators

解决方案


解决此问题的一种方法是使用grep两次,并将一个结果传递给下一个结果。

首先,我们找到所有长度为 9 的单词,就像你在上一个练习中所做的那样:

grep -Eo '\b\w{9}\b' countries

我正在使用o仅列出匹配单词的标志,每行打印一个单词。接下来,我们使用Linux 管道(不是正则表达式 OR)将第一个的输出提供grep给第二个grep

grep -Eo '\b\w{9}\b' countries | grep 'i'

最终输出将是所有包含 9 个字符的单词和i.

根据您的要求,如果您更专注于正则表达式,这种方法可能会被视为“作弊”,但如果您也在学习 Linux,则这是一个很好的解决方案。


您正在寻找单词的事实使正则表达式复杂化(与文件中的相反),但也可以提出单个正则表达式来匹配这些单词。

 \b(?=\w*i)\w{9}\b

这建立在\b\w{9}\b您已经拥有的基础上。(?=\w*i)AND条件。在我们找到单词 ( \b) 的开头之后,我们向前查找\w*i(零个或多个字母,然后是 our i)。我们\w*在前瞻中使用,不是.*,所以我们在看同一个词。在九个字符之后也会(?=.*i)匹配任何。 找到 后,我们继续确保单词只有 9 个字母。i
i

工作示例:https ://regex101.com/r/G5EVdM/1


推荐阅读