在简单的正则表达式中,我理解
\w
给出一个单词字符;但是,我不知道如何添加加号(+):
\w+
选择整个单词。在我看来,加号只意味着一个或多个单词字符,所以我不明白它是如何扩展到整个单词。
答案 0 :(得分:5)
类似于[0-9]+
表示一个或多个数字的方式,其中每个数字可能不同,类似地\w+
表示一个或多个单词字符 ,再次,每个角色可能不同。在这种正常的“贪婪”模式下,它一直持续到它再也找不到为止。 (在一些正则表达式中,你可以通过\w+?
使非贪婪,尽可能少地发现正则表达式匹配)。
如果你想要你想要的,重复地要求相同的角色,你需要使用反向引用:
(\w)\1*
- 找到任何单词字符,捕获它,然后找到零个或多个相同的字符。
使用正则表达式\w+
和输入字符串Hello World
,正则表达式将从头开始并对自己说,“下一个字符是否与\w
匹配?是的,所以我们将它添加到结果中,然后向前移动一个字符。“由于+
修饰符,在执行此操作后,它继续执行此操作,一次一步,直到找不到任何一个更多。此时它将移动到正则表达式的下一部分(如果有的话)或停止。只需\w+
即可获取Hello
的所有内容,但不会占据空格或World
。
默认+
修饰符启用“回溯”。这是正则表达式的一个(sometimes-expensive)功能,它允许您在提供最佳成功机会的同时表达您的愿望。例如,如果您的正则表达式为\w+l
且输入字符串为Hello World
,则正则表达式引擎将捕获所有Hello
,然后说“哦亲爱的,现在我需要找到一个l
。o
之后没有一个......也许我走得太远了?“它会备份直到它抓住Hell
并查看是否接下来有一个l
(没有),然后再次备份到Hel
并查看下一个是否有l
(有)。最终结果将只捕获字符串Hell
。
更有趣的是正则表达式\w+r
和输入字符串“Hello World”的情况。在这种情况下,引擎会捕获所有Hello
并查看其后是否有r
。由于它没有找到一个,它一次回溯一个字符,直到它发现H
后面没有r
,它说“也许以{开头{1}}不是一个好主意“并在字符串中继续前进。最终找到H
,然后回溯以仅捕获World
,并发现最终需要Wo
。此时它返回r
作为匹配。
答案 1 :(得分:2)
添加+
时,它匹配前面标记中的一个或多个。
它被称为greedy match
,在满足下一个标记之前会匹配尽可能多的字符。
http://regexr.com是使用正则表达式的绝佳工具,它还解释了运算符的作用。
答案 2 :(得分:1)
+
是一个贪婪的量词。这意味着它将匹配尽可能多的字符,即使存在有效的“较小”匹配。
在字符串Hello world
中,\w+
匹配Hello
和world
。
向它添加?
会使其变得非贪婪,并且会对最小有效匹配感到满意。
在字符串Hello world
中,\w+?
分别匹配每个字母。