Gre*_*con 765
最重要的部分是概念.一旦你理解了构建块的工作原理,语法上的差异就会比轻度方言更多.正则表达式引擎语法之上的层是您正在使用的编程语言的语法.像Perl这样的语言可以消除大部分此类复杂功能,但如果您在C程序中使用正则表达式,则必须记住其他注意事项.
如果您将正则表达式视为可以随意混合和匹配的构建块,它可以帮助您学习如何编写和调试自己的模式,以及如何理解其他人编写的模式.
从概念上讲,最简单的正则表达式是文字字符.该模式N匹配字符'N'.
彼此相邻的正则表达式匹配序列.例如,模式Nick匹配序列'N',后跟'i',后跟'c'后跟'k'.
如果你曾经grep在Unix上使用过 - 即使只是为了寻找看起来很普通的字符串 - 你已经在使用正则表达式了!(rein grep表示正则表达式.)
添加一点复杂性,您可以将"Nick"或"nick"与模式匹配[Nn]ick.方括号中的部分是一个字符类,这意味着它只匹配其中一个包含的字符.您还可以在字符类中使用范围,因此[a-c]匹配"a"或"b"或"c".
模式.是特殊的:它不是仅匹配文字点,而是匹配任何字符†.它在概念上与真正的大字符类相同[-.?+%$A-Za-z0-9...].
将字符类视为菜单:只选一个.
使用.可以节省大量的输入,还有其他常用模式的快捷方式.假设您想匹配一个数字:一种写入的方式[0-9].数字是常见的匹配目标,因此您可以使用快捷方式\d.其他是\s(空白)和\w(字符:字母数字或下划线).
大写变体是它们的补码,因此\S匹配任何非空白字符.
从那里,您可以使用量词重复模式的一部分.例如,模式ab?c匹配'abc'或'ac',因为?量词使其修改的子模式可选.其他量词是
* (零次或多次)+ (一次或多次){n}(恰好n次){n,}(至少n次){n,m}(至少n次但不超过m次)将这些块中的一些放在一起,模式[Nn]*ick匹配所有块
第一场比赛展示了一个重要的教训:*永远成功!任何模式都可以匹配零次.
一些其他有用的例子:
[0-9]+(及其等价物\d+)匹配任何非负整数\d{4}-\d{2}-\d{2} 匹配日期格式为2019-01-01量词将模式修改为其左边的模式.您可能希望0abc+0以符合"0abc0","0abcabc0",等等,但图案立刻到加量词的左边是c.这意味着0abc+0匹配'0abc0','0abcc0','0abccc0'等.
要将一个或多个'abc'序列与末尾的零匹配,请使用0(abc)+0.括号表示可以量化为单位的子模式.正则表达式引擎通常保存或"捕获"与括号组匹配的输入文本部分.以这种方式提取位比计算索引和方法更灵活,更不容易出错substr.
早些时候,我们看到了一种匹配"尼克"或"尼克"的方法.另一个是交替,如Nick|nick.请记住,交替包括左侧的所有内容和右侧的所有内容.使用分组括号限制的范围|,例如,(Nick|nick).
再举一个例子,您可以等效地写[a-c]为a|b|c,但这可能不是最理想的,因为许多实现假设替代将具有大于1的长度.
虽然有些角色与自己匹配,但其他角色具有特殊意义.该模式\d+与反斜杠不匹配,后跟小写D后跟加号:为了得到它,我们使用\\d\+.反斜杠从以下字符中删除特殊含义.
正则表达式量词是贪婪的.这意味着它们可以匹配尽可能多的文本,同时允许整个模式成功匹配.
例如,输入是
"你好,"她说,"你好吗?"
你可能希望".+"只匹配'你好',然后当你看到它从'你好'到'你'时它会匹配时会感到惊讶.
要从贪婪切换到您可能认为谨慎的内容,请?为量词添加额外内容.现在您了解了\((.+?)\)问题中的示例如何工作.它匹配文字左括号的序列,后跟一个或多个字符,并以右括号结束.
如果输入为'(123)(456)',则第一次捕获将为'123'.非贪婪量词希望允许模式的其余部分尽快开始匹配.
(至于你的困惑,我不知道任何正则表达式的方言((.+?))会做同样的事情.我怀疑在路上的某处传播丢失了某些东西.)
使用特殊模式^仅在输入的开头$匹配,并且仅在结尾处匹配.用你的模式制作"书挡",你说"我知道前后有什么,但给我一切"是一种有用的技巧.
假设您要匹配表单的注释
-- This is a comment --
你会写的^--\s+(.+)\s+--$.
正则表达式是递归的,所以既然你已经理解了这些基本规则,你可以随意组合它们.
†:上述.符合任何字符的陈述是教学目的的简化,并非严格属实.Dot匹配除换行符之外的任何字符"\n",但在实践中,您很少期望一种模式,例如.+跨越换行符边界.例如,Perl正则表达式有一个/s开关和Java Pattern.DOTALL,可以.匹配任何字符.对于没有这种功能的语言,你可以使用[\s\S]匹配"任何空格或任何非空格"的东西,换句话说就是任何东西.