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]
,但我知道这是完全错误的,我还应该说明我使用的数据中的任何空格,并排除它们。

对于GNU
grep
,您可以使用

  • 要匹配长度为8个字符且包含
    e
    字母的行:
    grep-p'^(?=.{8}$).*e'文件

  • 要提取长度为8个字符且包含
    e
    字母的单词:
    grep-oP'\b(?=\w{8}\b)\w*e\w*'文件

  • 请参阅和

    请注意不同的选项:
    -p
    启用PCRE正则表达式语法,
    -o
    强制
    grep
    输出匹配的子字符串,而不是整行(这就是为什么第一个正则表达式在
    e
    之前只有
    *
    e
    之后的
    *
    是多余的)

    正则表达式详细信息

    • ^(?=.{8}$).*e

      • ^
        -字符串的开头
      • (?=.{8}$)
        -一个正向前瞻,要求字符串长度为8个字符
      • *
        -尽可能多的0+字符(断线字符除外)
      • e
        -
        e
        char
    • \b(?=\w{8}\b)\w*e\w*

      • \b
        -单词边界
      • (?=\w{8}\b)
        -8个单词字符后跟单词边界必须立即出现在当前位置的右侧
      • \w*
        -0+字字符
      • e
        -a
        e
        字母
      • \w*
        -0+字字符

    如果只需要匹配字母,请将
    \w
    替换为
    [[:alpha:]
    (或
    \p{L}
    )。

    与GNU
    grep
    ,您可以使用

  • 要匹配长度为8个字符且包含
    e
    字母的行:
    grep-p'^(?=.{8}$).*e'文件

  • 要提取长度为8个字符且包含
    e
    字母的单词:
    grep-oP'\b(?=\w{8}\b)\w*e\w*'文件

  • 请参阅和

    请注意不同的选项:
    -p
    启用PCRE正则表达式语法,
    -o
    强制
    grep
    输出匹配的子字符串,而不是整行(这就是为什么第一个正则表达式在
    e
    之前只有
    *
    e
    之后的
    *
    是多余的)

    正则表达式详细信息

    • ^(?=.{8}$).*e

      • ^
        -字符串的开头
      • (?=.{8}$)
        -一个正向前瞻,要求字符串长度为8个字符
      • *
        -尽可能多的0+字符(断线字符除外)
      • e
        -
        e
        char
    • \b(?=\w{8}\b)\w*e\w*

      • \b
        -单词边界
      • (?=\w{8}\b)
        -8个单词字符后跟单词边界必须立即出现在当前位置的右侧
      • \w*
        -0+字字符
      • e
        -a
        e
        字母
      • \w*
        -0+字字符

    如果只需要匹配字母,请将
    \w
    替换为
    [[:alpha:]
    (或
    \p{L}
    )。

    您可以断言8个单词字符,匹配单词字符,直到第一次出现
    e
    ,然后是可选的单词字符

    \b(?=\w{8}\b)[^\We]*e\w*
    
    |

    • \b
      单词边界
    • (?=\w{8}\b)
      正向前瞻,在右边的8个单词字符后面加一个单词边界断言
    • [^\We]*
      ,匹配0+个字符(e除外)
    • e
      Match
      e
    • \w*
      匹配0+个字符
    比如说

    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
      单词边界
    • (?=\w{8}\b)
      正向前瞻,在右边的8个单词字符后面加一个单词边界断言
    • [^\We]*
      ,匹配0+个字符(e除外)
    • e
      Match
      e
    • \w*
      匹配0+个字符
    比如说

    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简化为<