我厌倦了总是试图猜测,如果我应该转义特殊字符,如'()[]{}|'等使用regexp的许多实现时。
它与Python、sed、grep、awk、Perl、rename、Apache、find等不同。 有没有什么规则集告诉我什么时候应该转义,什么时候不应该转义特殊字符?它是否依赖于regexp类型,如PCRE、POSIX或扩展的regexp ?
我厌倦了总是试图猜测,如果我应该转义特殊字符,如'()[]{}|'等使用regexp的许多实现时。
它与Python、sed、grep、awk、Perl、rename、Apache、find等不同。 有没有什么规则集告诉我什么时候应该转义,什么时候不应该转义特殊字符?它是否依赖于regexp类型,如PCRE、POSIX或扩展的regexp ?
当前回答
真的,没有。正则表达式语法大约有无数种;它们似乎可以归结为Perl、EMACS/GNU和AT&T,但我也总是感到惊讶。
其他回答
真的,没有。正则表达式语法大约有无数种;它们似乎可以归结为Perl、EMACS/GNU和AT&T,但我也总是感到惊讶。
不幸的是,确实没有一组转义码,因为它根据您使用的语言而变化。
然而,保留一个像正则表达式工具页面或这个正则表达式小抄表这样的页面可以帮助你快速过滤东西。
使用Raku(以前称为Perl_6)
工作(反斜杠或引号除下划线以外的所有非字母数字字符):
~$ raku -e 'say $/ if "#.*?" ~~ m/ \# \. \* \? /; #works fine'
「#.*?」
根据Damian Conway的演讲“你所知道的关于正则表达式的一切都是错误的”,正则表达式语言有六种风格。Raku代表了对标准Perl(5)/PCRE正则表达式的重大(大约15年)重做。
在这15年中,Perl_6 / Raku语言专家决定,所有非字母数字字符(下划线除外)都应保留为Regex元字符,即使目前不存在这种用法。要将非字母数字字符(下划线除外)表示为字面量、反斜杠或转义。
因此,上面的例子打印$/ match变量,如果匹配到文字#.*?找到字符序列。下面是如果你不这样做会发生什么:#被解释为注释的开始,。点被解释为任何字符(包括空格),*星号被解释为零或多个量词,而?问号被解释为0或1量词或节俭(即非贪婪)量词-修饰语(取决于上下文):
错误:
~$ ~$ raku -e 'say $/ if "#.*?" ~~ m/ # . * ? /; #ERROR!'
===SORRY!===
Regex not terminated.
at -e:1
------> y $/ if "#.*?" ~~ m/ # . * ? /; #ERROR!⏏<EOL>
Regex not terminated.
at -e:1
------> y $/ if "#.*?" ~~ m/ # . * ? /; #ERROR!⏏<EOL>
Couldn't find terminator / (corresponding / was at line 1)
at -e:1
------> y $/ if "#.*?" ~~ m/ # . * ? /; #ERROR!⏏<EOL>
expecting any of:
/
https://docs.raku.org/language/regexes https://raku.org/
为了避免担心哪个regex变量和所有定制的特性,只需使用这个通用函数,它涵盖了除了BRE之外的每个regex变量(除非它们有unicode多字节字符是元字符):
jot -s '' -c - 32 126 |
mawk ' 功能 重返substr(_ =””, gsub ("[][!-/_\ 140 :-@{-~]","[&]",__), gsub ("["(_="\\\\")"^]",_ "&",__))__ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
!"#$%&'()*+,-./0123456789:;<=>?
@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_
`abcdefghijklmnopqrstuvwxyz{|}~
[!]["][#][$][%][&]['][(][)][*][+][,][-][.][/]
0 1 2 3 4 5 6 7 8 9 [:][;][<][=][>][?]
[@] ABCDEFGHIJKLMNOPQRSTUVWXYZ [[]\\ []]\^ [_]
[`] abcdefghijklmnopqrstuvwxyz [{][|][}][~]
方括号更容易处理,因为没有触发关于“转义太多”的警告信息的风险,例如:
function ____(_) {
return substr("", gsub("[[:punct:]]","\\\\&",_))_
}
\!\"\#\$\%\&\'\(\)\*\+\,\-\.\/ 0123456789\:\;\<\=\>\?
\@ABCDEFGHIJKLMNOPQRSTUVWXYZ\[\\\]\^\_\`abcdefghijklmnopqrstuvwxyz \{\|\}\~
gawk: cmd. line:1: warning: regexp escape sequence `\!' is not a known regexp operator
gawk: cmd. line:1: warning: regexp escape sequence `\"' is not a known regexp operator
gawk: cmd. line:1: warning: regexp escape sequence `\#' is not a known regexp operator
gawk: cmd. line:1: warning: regexp escape sequence `\%' is not a known regexp operator
gawk: cmd. line:1: warning: regexp escape sequence `\&' is not a known regexp operator
gawk: cmd. line:1: warning: regexp escape sequence `\,' is not a known regexp operator
gawk: cmd. line:1: warning: regexp escape sequence `\:' is not a known regexp operator
gawk: cmd. line:1: warning: regexp escape sequence `\;' is not a known regexp operator
gawk: cmd. line:1: warning: regexp escape sequence `\=' is not a known regexp operator
gawk: cmd. line:1: warning: regexp escape sequence `\@' is not a known regexp operator
gawk: cmd. line:1: warning: regexp escape sequence `\_' is not a known regexp operator
gawk: cmd. line:1: warning: regexp escape sequence `\~' is not a known regexp operator
https://perldoc.perl.org/perlre.html#Quoting-metacharacters和https://perldoc.perl.org/functions/quotemeta.html
在官方文档中,这样的字符称为元字符。引用的例子:
my $regex = quotemeta($string)
s/$regex/something/