正则表达式中的 `[]` 起什么作用?

正则表达式中的 `[]` 起什么作用?

该网页包含许多正则表达式,其中包括[]

http://mmcif.wwpdb.org/dictionaries/ascii/mmcif_pdbx_v40.dic

一个例子:

[][_,.;:"&<>()/\{}'`~!@#$%A-Za-z0-9*|+-]*

该页面提供了有关正在使用的正则表达式的特定风格的评论:

此处定义的正则表达式不符合 POSIX 1003.2 标准,因为它们包含特殊字符“\n”和“\t”。这些正则表达式已在 POSIX 模式下使用 Richard Stallman 的 GNU 正则表达式库 0.12 版进行了测试。

这是什么[]意思?

答案1

以这种方式编写模式是为了避免需要]在定义的字符类中转义字符(以及连字符)。

未转义时,]结束字符类。但是,如果[紧接着使用],则表示“结束方括号”包含在字符类中,这是一种特殊构造。

类似地,一旦您使用 打开一个字符类[,进一步使用[表示在字符类中包含“开方括号”,因为不允许“嵌套字符类”。

连字符 ( -) 位于类定义最末尾也是一个特殊用例,否则,在字符类中使用连字符就表示要包含在该类中的字符范围。

因此,Regex 引擎将您的示例模式解析为:

[ {open the character class}
] {include closing bracket}
[_,.;:"&<>()/\{}'`~!@#$%A-Za-z0-9*|+ {include a bunch of characters; [().*{}|+, etc. are not special characters within a class definition}
- {include hyphen}
] {close the character class}
* {zero or more repetitions of the class}

答案2

当紧跟在左方括号后面时,右方括号仅表示其自身]。下一个左方括号也仅表示其自己的字符[

$ echo "a[b" | grep '[]]'
$ echo "a[b" | grep '[[]' 
a[b
$ echo "a[b" | grep '[]'  
grep: Unmatched [ or [^

答案3

据我所知,[] 没有任何意义,括号用于定义字符范围。空范围没有任何意义。

现在,查看您链接中的更改日志......

1.048 2007-11-18

变化:(jdw/kh)

  • 将 '[]' 添加到数据类型代码和 ucode 的允许字符中 -

相关内容