Sam*_*Sam 4 regex standards sed
最近我被告知,+(前一个模式/字符的一次或多次出现)不是基本正则表达式的一部分.甚至没有写成\+.
这是关于最大兼容性的问题.
我的印象是......
echo "Hello World, I am an example-text" | sed 's#[^a-z0-9]\+#.#ig'
Run Code Online (Sandbox Code Playgroud)
...总是导致:
Hello.World.I.am.an.example.text
Run Code Online (Sandbox Code Playgroud)
但后来我被告知"它取代了所有字符,而不是小写字母或数字后跟+",它与...相同[^a-z0-9][+].
所以我真正的问题是:是否有任何正则表达式的定义或实现不同于x+或x\+不相同xx*.
POSIX"基本"正则表达式不支持+ (也不?支持!).sed的大多数实现都添加了支持,\+但它不是POSIX标准功能.如果您的目标是最大可移植性,则应避免使用它.请注意,您必须使用\+而不是更常见+.
echo "Hello World, I am an example-text" | sed 's#[^a-z0-9]\+#.#ig'
Run Code Online (Sandbox Code Playgroud)
该-E标志启用"扩展"正则表达式,它更接近Perl,JavaScript和大多数其他现代正则表达式引擎中使用的语法.随着-E你不需要有一个反斜杠; 它很简单+.
echo "Hello World, I am an example-text" | sed -E 's#[^a-z0-9]+#.#ig'
Run Code Online (Sandbox Code Playgroud)
来自https://www.regular-expressions.info/posix.html:
POSIX或"用于uniX的可移植操作系统接口"是一组标准,用于定义(UNIX)操作系统应支持的一些功能.其中一个标准定义了两种正则表达式.涉及正则表达式的命令(例如grep和egrep)在符合POSIX的UNIX系统上实现这些风格.一些数据库系统也使用POSIX正则表达式.
Basic Regular Expressions或BRE flavor标准化了类似于传统UNIX grep命令所使用的风格.这几乎是目前仍在使用的最古老的正则表达风味.将这种风格区分开来的一件事是,大多数元字符需要反斜杠才能赋予元字符其风味.大多数其他风格,包括POSIX ERE,使用反斜杠来抑制元字符的含义.使用反斜杠来转义从不是元字符的字符是一个错误.
BRE支持POSIX括号表达式,类似于其他正则表达式中的字符类,具有一些特殊功能.不支持短号.使用常用元字符的其他功能是匹配除换行符之外的任何字符的点,匹配字符串开头和结尾的插入符号和美元,以及重复令牌零次或多次的星号.要按字面意义匹配任何这些字符,请使用反斜杠来逃避它们.
其他BRE元字符需要反斜杠才能赋予它们特殊的含义.原因是最旧版本的UNIX grep不支持这些.grep的开发人员希望它与现有的正则表达式兼容,后者可能将这些字符用作文字字符.BRE
a{1,2}符合a{1,2}字面意思,a\{1,2\}匹配a或aa.一些实施方式支持\?和\+作为替代的语法\{0,1\}和\{1,\},但\?并\+不是POSIX标准的一部分.令牌可以与\(和分组\).反向引用是通常的\1通过\9.最多只允许9组.如\(ab\)\1匹配abab,同时(ab)\1是无效的,因为有对应的反向引用不存在捕获组\1.使用\\1匹配\1字面上.POSIX BRE不支持任何其他功能.甚至不支持交替.
(强调我的.)
所以我真正的问题是:是否有任何正则表达式的定义或实现不同于
x+或x\+不相同xx*.
我想不出任何既不支持+也不支持的现实世界语言或工具\+.
这三个操作足以赋予正则表达式†的完整表达能力.经营者喜欢?和+在编程方便,但在数学上下文中不是必需的.如果需要,它们是根据其他来定义的:R?是- [R |ε和R +是RR*.
†从数学上讲,就是这样.形式语言理论中不存在背向引用和向前看/向后看等特征.这些特征增加了正则表达式的数学定义中不具备的额外表达能力.