[0-9]{3} 和 [0-9] 有什么区别正则表达式中的 {3}?

[0-9]{3} 和 [0-9] 有什么区别正则表达式中的 {3}?

我有一个文件——

cat regex30.txt 
(914).582.3013
(873).334.2589
(521).589.3147
(625).235.3698
(895).568.2145
(745).256.3369

我想将其转换为

914.582.3013
873.334.2589
521.589.3147
625.235.3698
895.568.2145
745.256.3369

这是我的步骤 -

sed -r 's/\(([0-9]<Space>{3})\)(\.[0-9]{3}\.[0-9]{4})/\1\2/g' regex30.txt 

然后我得到结果 -

(914).582.3013
(873).334.2589
(521).589.3147
(625).235.3698
(895).568.2145
(745).256.3369

为什么我会得到这个结果?为什么空间在那里很重要?

如果我删除空间,那么它就可以正常工作。

sed -r 's/\(([0-9]{3})\)(\.[0-9]{3}\.[0-9]{4})/\1\2/g' regex30.txt 
914.582.3013
873.334.2589
521.589.3147
625.235.3698
895.568.2145
745.256.3369

我的理解是[0-9] {3}--表示3位数字,也可以从0开始。

[0-9]{3}正则表达式和之间有什么区别[0-9] {3}

为什么空间在那里很重要,或者是我无法同时看到的东西。

我以为'\s'是用来表示空格的。

答案1

免责声明:我没有尝试解析您的正则表达式。这是您问题的答案。

[0-9]{3}正好表示三位小数。[0-9] {3}表示一个十进制数字后跟三个空格。之所以如此,是因为{3}(即所谓的“束缚”)重复了其前面的所谓“原子”。

从正则表达式手册页:

$ man regex
... An atom followed by a bound containing one integer i and no comma 
matches a sequence of exactly i matches of the atom. ...

术语“原子”在以下段落中定义。很棒的阅读。

答案2

我知道唯一可以忽略空格的正则表达式是 perl 正则表达式或兼容的正则表达式和 ast-open 正则表达式(它确实从 perl 正则表达式借用了许多运算符),尽管默认情况下不会这样做,只有在x启用该标志时才这样做。

AFAIK,仅ssed支持带有 -R 选项的 PCRE。

所以你需要:

ssed -R 's/ \d {3}/.../gx'
ssed -R 's/(?x) \d {3}/.../g'

或者(ast-open sed,如果启用,它也是sedksh93 的内置函数):

ast-sed    's/\(?x\) \d \{3\}/.../g'
ast-sed -E 's/(?x) \d {3}/.../g'
ast-sed -A 's/(?x) \d {3}/.../g'

(对于它支持的 3 种正则表达式:基本、扩展、增强)。

启用该x标志后,要匹配文字空格字符,您需要[ ]在空格前加上前缀\(或\x20在基于 ASCII 的系统上使用)。

相关内容