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

时间:2019-06-23 09:58:59

标签: regex awk sed grep logical-operators

我正在通过RegEx进行实验室研究,要求我:

  

在“国家”文件中搜索所有9个字符的单词,然后   字母i。
有多少个结果?

我正在在线仿真环境中的通用Linux命令提示符下工作。我被允许使用grepawksed,尽管我感到偏爱grep

(关于RegEx,我是100%的菜鸟,所以向我解释一下,就像我5岁)

在以前的实验中,我已经使用了类似下面的方法,该方法可以找到具有9个字符的所有国家/地区,但是我无法找到一种方法来找到具有9个字符的所有单词,并且在任何位置都包含字母i位置。

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

|运算符无济于事,因为它是OR运算符,它将为我找到所有找到的i实例,以及所有9个字符的单词,并且我都需要同时出现同时。我也尝试了多个grep语句,看来仿真器可能不接受。

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

1 个答案:

答案 0 :(得分:1)

解决此问题的一种方法是两次使用grep,然后将一个结果传送到下一个。

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

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

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

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

最终输出将是所有带有9个字符和i的单词。

根据您的要求,如果您更专注于Regex,则可以将这种方法视为“作弊”,而如果您还学习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匹配,也这9个字符之后。
找到i之后,我们将继续确保单词只有9个字母。

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