regex - 如何创建具有多个条件的 RegEx?
问题描述
我正在通过 RegEx 实验室工作,该实验室要求我:
在“国家”文件中搜索所有包含九个字符和字母 i 的单词。
找到多少个结果?
我正在在线模拟环境中的通用 Linux 命令提示符下工作。我被允许使用grep
,awk
或者sed
虽然我感觉偏爱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 管道(不是正则表达式 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
推荐阅读
- computer-science - 什么是微指令?
- python - 使用 PyQt 和 openCV 录制视频/直播流的正确方法
- slurm - 访问数组作业的任务 ID
- python - PIL:我在哪里可以找到包含 PILLOW 抛出的所有异常的“异常”类
- r - 是否可以根据变量对时间序列进行多色?
- typescript - Typescript 4.0 添加了干扰 RequireJS 的 export {}
- android - DropDownAnchor 在 AutoCompleteTextView 中不起作用
- java - 没有主要清单属性错误-带有 Maven jar 插件的 IntelliJ
- arrays - Using the each operator with the without function in APL
- react-native - TextInput placeholder style not work properly