如何创建具有多个条件的 RegEx?

How do I create a RegEx which has multiple criteria?

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

Search the 'countries' file for all the words with nine characters and the letter i.
How many results are found?

我正在在线模拟环境中的通用 Linux 命令提示符下工作。我可以使用 grepawksed,但我更喜欢 grep

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

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

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

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

我也在尝试坚持使用 [] 字符集,因为下一个问题要求在 9 个字母的单词中包含多个字母。

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

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

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

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

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

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

根据您的要求,如果您更专注于正则表达式,则可以考虑使用此方法 "cheating",但如果您也在学习 Linux.

,则这是一个很好的解决方案

你正在寻找 words 的事实使正则表达式复杂化(与文件中的 lines 相反),但它也是可能的想出一个正则表达式来匹配这些词。

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

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

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