注意:我不确定我的正则表达式是否正确,因为我在学校的教科书没有解释/教授这种形式的正则表达式,只有数学表格如DFA / NFA
我将不胜感激任何建议或提示
问题:
(a)在文本中发现所有出现的三个字母单词,以“a”开头,以“e”结尾;
(b)查找文本中以“m”开头并以“r”结尾的所有单词;
我的方法:
a)^[a][a-zA-Z][e]$
(如何区分3个字母的单词和所有单词?)
b)^[m][a-zA-Z][r]$
此外,我想在linux中使用这些正则表达式,那么以下命令是否有效?:
grep '^[a][a-zA-Z][e]$' 'usr/dir/.../text.txt'
或者我应该以这种方式使用egrep:
find . -text "*.txt" -print0 | xargs -0 egrep '^[a][a-zA-Z][e]$'
答案 0 :(得分:4)
您可以使用grep -w
替换两个匹配的正则表达式:
grep -w 'a[a-zA-Z]e\|m[a-zA-Z]*r' file.txt
答案 1 :(得分:1)
您可以使用单词边界\b
来匹配单词的开头和结尾:
a)在文本中找到所有出现的以“a”开头且以“e”结尾的三个字母单词;
grep -o '\ba[a-zA-Z]e\b'
模式匹配单词边界,然后是跟随a
,单个字符和后续e
以及单词边界。
b)查找文本中以“m”开头并以“r”结尾的所有单词;
grep -o '\bm[a-zA-Z]*r\b'
模式匹配单词边界,m
零个以上的字符(通过*
量词),r
和单词边界。
此外,我正在使用选项-o
,它在自己的行上输出每个匹配,而不是输出包含匹配的整行输入。
顺便说一句,感谢选项-w
- 只匹配整个单词 - 您甚至可以将上述模式简化为:
A)
grep -wo 'a[a-zA-Z]e'
和b)
grep -wo 'm[a-zA-Z]*r'
感谢@anubhava!
您要求egrep
。 egrep
无法帮助简化或优化模式。 grep
绝对没问题。
答案 2 :(得分:0)
首先,egrep
已延长grep
,与使用选项grep
调用-E
相同。其次,在许多情况下,您不需要使用find
和xargs
因为-r
选项将在指定路径中的文件中递归搜索。
您的正则表达式适合grep
支持的基本(非扩展)正则表达式语言,因此不需要egrep
。
我会将其简化为
grep -r '^a[a-zA-Z]e$' /usr/share/dict/
和这个
grep -r '^m[a-zA-Z]*r$' /usr/share/dict/
答案 3 :(得分:0)
在你的例子中,你只会匹配与三个字符匹配的整行,与你期望的字母相匹配。
'^'表示行的开头
'$'表示该行的结尾
为了只抽出三个字母的单词,你必须在一些空格上匹配。例如 grep'a [a-Z] e''usr / dir /.../ text.txt'
然而,这将错过行开头或结尾处的三个字母单词的所有实例
here is an issue using egrep and grep to match whitespace/start of line