sed 的正则表达式字符类(例如 [abc])中的顺序重要吗?

sed 的正则表达式字符类(例如 [abc])中的顺序重要吗?

我想最好从一个例子开始:

> echo "[20-20:10]Something" | sed -r -e 's/^\[[0-9\:\-]+(.*)$/\1/' 
]Something
> echo "[20-20:10]Something" | sed -r -e 's/^\[[0-9\-\:]+(.*)$/\1/' 
-20:10]Something

唯一的区别是我交换了正则表达式字符类中的:和字符。-那么:在 sed 的正则表达式的字符类中,字符的顺序重要吗?我似乎在不同的正则表达式系统上并不重要,比如https://regex101.com/

我在 Google 上找不到有关此行为的任何信息,但我想了解更多,因为我想确保知道我的脚本的作用。

答案1

有一些规则。在这种情况下,重要的是这-是一个范围操作,因此您可以说a-f而不是abcdef在类内部。要包含 a-作为文字字符,如果它是类中的最后一个字符,则最简单,但它可以是范围的第一个或任一端。

如果你想否定一组字符,那么第一个字符必须是^。要将其作为文字包含在内,那么它一定不能是第一个。

]类结束时,有一种特殊情况,允许它成为第一个(如果第一个字符要^否定该类,则为第二个),[]abc]一组 4 个字符a b c或 也是如此]

答案2

是的,这很重要,因为[0-9\:\-]匹配数字、反斜杠、冒号或破折号中的任何单个字符,而不[0-9\-\:]匹配破折号。在第二个表达式中,破折号表示反斜杠字符和反斜杠字符之间的范围(反斜杠是文字,是字符类),并且该表达式相当于[0-9\:](or, 就此而言[\0-9:])。

破折号确实不是^如果它是字符类中的第一个(可能在 后面)或最后一个,则表示一系列字符。

另请注意,它sed处理 POSIX 正则表达式,我认为您链接到的网站不明确支持该表达式(请参阅为什么我的正则表达式在 X 中有效但在 Y 中无效?)。

相关内容