为什么POSIX blacket表达需要在另一个blacket?

时间:2017-12-11 10:06:41

标签: regex sed posix

Qustion

POSIX表达式如[:space:]需要在另一个[]中的原因是什么?

$ echo "a b c" | sed 's/[:space:]*/_/g'
_ _b_ _

$ echo "a b c" | sed 's/[[:space:]]*/_/g'
_a_b_c_

$ echo "a b c" | sed 's/[[:space:]][[:space:]]*/_/g'
a_b_c

更新

Regular Expressions/POSIX Basic Regular Expressions

  

角色等级
  POSIX标准定义了一些类或字符类别,如下所示。这些类在括号中使用

我不明白字符类是什么,但是假设它是一个匹配任何空格的特殊字符,因此相信' s / [:space:] / _ g /'会匹配中间的空间" b"但是我认为' [:space:]'本身不匹配任何字符(如果仍然错误,请更正)。

我认为[:space:]就像' \ t \ n \ r \ n \ f \ v'但它本身没有任何功能。使用blacket' [[:space:]]',它具有与' [\ t \ n \ r \ f \ v]'相同的功能。

1 个答案:

答案 0 :(得分:1)

您需要了解术语:

括号表达式[]中包含的一组字符,可以在regexp中使用。该组字符可以由以下任意组合(以及可选的初始^否定字符)的任意组合表示:

  1. 字符列表,例如abcd...z
  2. 字符范围,例如a-z
  3. 字符类,例如[:lower:]
  4. 所以[:space:]是一个字符类(代表所有空白字符),可以在regexp中的括号表达式[...]中使用,就像你在括号内专门列出所有空格字符一样表达[...]。所以这个:

    [:space:]
    

    只是一个字符类,而这个:

    [[:space:]]
    

    是一个括号表达式,包括所有空格字符,以及:

    [[:space:][:lower:]_#;A-D]
    

    是一个括号表达式,包括高大的空白字符加上所有小写字母加上字符_,#和;加上A到D范围内的字母(无论你的语言环境中有哪些字符)。