为了账号安全,请及时绑定邮箱和手机立即绑定

学习正则表达式[关闭]

/ 猿问

学习正则表达式[关闭]

学习正则表达式

我真的不懂正则表达式。你能以一种易于理解的方式向我解释这些吗?如果有任何在线工具或书籍,您还可以链接到它们吗?



查看完整描述

1 回答

?
料青山看我应如是

最重要的部分是概念。一旦你理解了构建块的工作原理,语法上的差异就会比温和的方言更多。正则表达式引擎语法之上的层是您正在使用的编程语言的语法。像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匹配所有块

  • ICK

  • 缺口

  • 缺口

  • Nnick

  • nNick

  • nnick

  • (等等)

第一场比赛展示了一个重要的教训:*永远成功!任何模式都可以匹配零次。

一些其他有用的例子:

  • [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+--$

建立你自己的

正则表达式是递归的,所以既然你已经理解了这些基本规则,你可以随意组合它们。

用于编写和调试正则表达式的工具:

图书

免费资源


查看完整回答
反对 回复 2019-05-21

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信