Regex 学习正则表达式
我不太懂正则表达式。你能用简单易懂的方式给我解释一下吗?如果有任何在线工具或书籍,您也可以链接到它们吗?最重要的部分是概念。一旦您了解了构建块的工作原理,语法上的差异只不过是温和的方言。正则表达式引擎语法之上的一层是您正在使用的编程语言的语法。Perl之类的语言消除了大部分这种复杂性,但如果在C程序中使用正则表达式,则必须记住其他注意事项 如果您认为正则表达式是可以随意混合和匹配的构建块,那么它可以帮助您学习如何编写和调试自己的模式,以及如何理解他人编写的模式 从简单开始 从概念上讲,最简单的正则表达式是文字字符。模式Regex 学习正则表达式,regex,Regex,我不太懂正则表达式。你能用简单易懂的方式给我解释一下吗?如果有任何在线工具或书籍,您也可以链接到它们吗?最重要的部分是概念。一旦您了解了构建块的工作原理,语法上的差异只不过是温和的方言。正则表达式引擎语法之上的一层是您正在使用的编程语言的语法。Perl之类的语言消除了大部分这种复杂性,但如果在C程序中使用正则表达式,则必须记住其他注意事项 如果您认为正则表达式是可以随意混合和匹配的构建块,那么它可以帮助您学习如何编写和调试自己的模式,以及如何理解他人编写的模式 从简单开始 从概念上讲,最简单的正
N
与字符“N”匹配
相邻的正则表达式匹配序列。例如,模式Nick
匹配序列“N”,后跟“i”,后跟“c”,后跟“k”
如果您曾经在Unix上使用过grep
,即使只是搜索外观普通的字符串,您已经在使用正则表达式了!(grep
中的re
表示正则表达式。)
从菜单上点菜
只需增加一点复杂性,就可以将“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+
匹配格式类似2019-01-01的日期\d{4}-\d{2}-\d{2}
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\+
。反斜杠删除以下字符的特殊含义
贪婪
正则表达式量词是贪婪的。这意味着它们尽可能多地匹配文本,同时允许整个模式成功匹配
例如,假设输入是
“你好,”她说,“你好吗?”
您可能希望“+”
只匹配“Hello”,然后当您看到它从“Hello”一直匹配到“You?”,您会感到惊讶
要从贪婪切换到您可能认为谨慎的状态,请在量词中添加一个额外的?
。现在您了解了\(.+?)\)
,您问题中的示例是如何工作的。它匹配文字左括号的序列,后跟一个或多个字符,并以右括号终止
如果您的输入是“(123)