我不是很理解正则表达式。你能够简单易懂地给我解释一下吗?如果有任何在线工具或书籍,你能否也提供链接?
模式.
是特殊的:它匹配任何字符†,而不仅仅是一个字面上的句点。在概念上,它与真正大的字符类[-.?+%$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'等。0(abc)+0
。括号表示可作为一个单元进行量化的子模式。正则表达式引擎通常会保存或“捕获”与带括号组匹配的输入文本部分。这种方式提取位更加灵活,比计数索引和substr
方法更少出错。
Nick|nick
。请记住,选择包含其左侧和右侧的所有内容。使用分组括号来限制|
的范围,例如(Nick|nick)
。[a-c]
等效地写成a|b|c
,但这可能不是最佳选择,因为许多实现假定备选项的长度大于1。
\d+
不匹配反斜杠后跟小写字母D后跟加号:要获得该结果,我们需要使用\\d\+
。反斜杠会去除下一个字符的特殊含义。".+"
仅匹配'Hello,',但当你发现它从'Hello'一直匹配到'you?'时,你会感到惊讶。?
。现在你明白了你的问题中的示例\((.+?)\)
是如何工作的。它匹配一个文字左括号,后跟一个或多个字符,并以右括号终止的序列。((.+?))
做同样的事情。我怀疑在传输过程中某些内容丢失了。)^
匹配输入的开头,使用$
仅匹配结尾。在您的模式中制作“书框”,其中您说:“我知道前面和后面是什么,但请给我中间的所有内容”是一种有用的技术。^--\s+(.+)\s+--$
。
†: 上述说法中的.
匹配任何字符是为了教学目的而进行的简化,严格来说并不正确。点号匹配除换行符"\n"
以外的任何字符,但在实践中,您很少期望像.+
这样的模式跨越换行边界。例如,Perl正则表达式有一个/s
开关,Java有Pattern.DOTALL
,可以使.
匹配任何字符。对于没有此功能的语言,您可以使用类似[\s\S]
的方法来匹配“任何空白或任何非空白”,换句话说就是任何东西。
a{,m}
这样的写法并不存在。 - anon