Regex 使用grep匹配包含特定字符且长度为x个字符的行
我正在努力学习正则表达式以及如何使用它。我一直在尝试为Regex 使用grep匹配包含特定字符且长度为x个字符的行,regex,grep,Regex,Grep,我正在努力学习正则表达式以及如何使用它。我一直在尝试为grep编写一个正则表达式,向我展示包含字母e且长度为8个字符的单词 到目前为止,我提出了\w+.I\X{8],但我知道这是完全错误的,我还应该说明我使用的数据中的任何空格,并排除它们。对于GNUgrep,您可以使用 要匹配长度为8个字符且包含e字母的行:grep-p'^(?=.{8}$).*e'文件 要提取长度为8个字符且包含e字母的单词:grep-oP'\b(?=\w{8}\b)\w*e\w*'文件 请参阅和 请注意不同的选项:-p启用P
grep
编写一个正则表达式,向我展示包含字母e且长度为8个字符的单词
到目前为止,我提出了
\w+.I\X{8]
,但我知道这是完全错误的,我还应该说明我使用的数据中的任何空格,并排除它们。对于GNUgrep
,您可以使用
e
字母的行:grep-p'^(?=.{8}$).*e'文件
e
字母的单词:grep-oP'\b(?=\w{8}\b)\w*e\w*'文件
-p
启用PCRE正则表达式语法,-o
强制grep
输出匹配的子字符串,而不是整行(这就是为什么第一个正则表达式在e
之前只有*
,e
之后的*
是多余的)
正则表达式详细信息
^(?=.{8}$).*e
-字符串的开头^
-一个正向前瞻,要求字符串长度为8个字符(?=.{8}$)
-尽可能多的0+字符(断线字符除外)*
-e
chare
\b(?=\w{8}\b)\w*e\w*
-单词边界\b
-8个单词字符后跟单词边界必须立即出现在当前位置的右侧(?=\w{8}\b)
-0+字字符\w*
-ae
字母e
-0+字字符\w*
如果只需要匹配字母,请将
\w
替换为[[:alpha:]
(或\p{L}
)。与GNUgrep
,您可以使用
e
字母的行:grep-p'^(?=.{8}$).*e'文件
e
字母的单词:grep-oP'\b(?=\w{8}\b)\w*e\w*'文件
-p
启用PCRE正则表达式语法,-o
强制grep
输出匹配的子字符串,而不是整行(这就是为什么第一个正则表达式在e
之前只有*
,e
之后的*
是多余的)
正则表达式详细信息
^(?=.{8}$).*e
-字符串的开头^
-一个正向前瞻,要求字符串长度为8个字符(?=.{8}$)
-尽可能多的0+字符(断线字符除外)*
-e
chare
\b(?=\w{8}\b)\w*e\w*
-单词边界\b
-8个单词字符后跟单词边界必须立即出现在当前位置的右侧(?=\w{8}\b)
-0+字字符\w*
-ae
字母e
-0+字字符\w*
如果只需要匹配字母,请将
\w
替换为[[:alpha:]
(或\p{L}
)。您可以断言8个单词字符,匹配单词字符,直到第一次出现e
,然后是可选的单词字符
\b(?=\w{8}\b)[^\We]*e\w*
|
单词边界\b
正向前瞻,在右边的8个单词字符后面加一个单词边界断言(?=\w{8}\b)
,匹配0+个字符(e除外)[^\We]*
Matche
e
匹配0+个字符\w*
echo "test testing atesting atestingb" | grep -Po '\b(?=\w{8}\b)[^\We]*e\w*'
- 要使用前瞻,请使用
或-P
-perl regexp
- 要仅打印匹配的零件,请使用
或-o
-仅匹配
atesting
您可以断言8个单词字符,匹配单词字符,直到第一次出现
e
,然后出现可选的单词字符
\b(?=\w{8}\b)[^\We]*e\w*
|
单词边界\b
正向前瞻,在右边的8个单词字符后面加一个单词边界断言(?=\w{8}\b)
,匹配0+个字符(e除外)[^\We]*
Matche
e
匹配0+个字符\w*
echo "test testing atesting atestingb" | grep -Po '\b(?=\w{8}\b)[^\We]*e\w*'
- 要使用前瞻,请使用
或-P
-perl regexp
- 要仅打印匹配的零件,请使用
或-o
-仅匹配
atesting
您使用的是什么正则表达式引擎?您有两个要求,需要对其中一个使用正向前瞻。例如,
^(?=.{8}$)[a-z]*e[a-z]*$
,设置了大小写无关标志。行锚和正向前瞻的开头,^(?=.{8}$
,断言行或字符串正好包含8个字符(任意字符)。余数与零个或多个字母(可能包括其他“e”
)前后的“e”
匹配。如果希望字符串只包含一个“e”
,请编写^(?=[a-z]{8}$[^e]*e[^e]*$
。如果仅包含单词字符\b(?=\w{8}\b)[^\We*e\w+\b
建议:你说你正在尝试学习正则表达式。虽然lookarounds非常有用和强大,但我不认为它们是正则表达式的良好起点。Feyd,将我在上面的评论中给出的第一个正则表达式与@Thefourthbird提供的正则表达式进行比较是有益的。首先,第四个正则表达式表明我的正则表达式可能是si简化为<