我正在研究problem 6 on regexone.com并且我无法理解如何将“更改”分组工作。 这是测试字符串:
The quick brown fox...
并且任务是捕获The quick brown fox...
而没有可以使用^\s*([\w\s.]*)\s*$
完成的额外空格。
但是当我尝试这些时:
^\s*(\w|\s|\.)*\s*$
抓住一个群组'.'
([27-28])为什么?所以^\s*((\w|\s|\.)*)\s*$
捕获两组 - The quick brown fox...
[6-28]和'.'
([27-28])。
分组如何运作?使用变更和字符类有什么不同,除了字符类匹配字符,而变更匹配单词(我的基本理解)?
P.S。:当我甚至不知道他们叫什么时,我应该如何搜索有关此类问题的信息?
答案 0 :(得分:1)
^\s*(\w|\s|\.)*\s*$
捕获一个群组'。' ([27-28])为什么?
原因是捕获组将它们匹配的文本存储在一种缓冲区或堆栈中。 *
量词使正则表达式引擎重复捕获无限次,并在每次重写缓冲区中的值时将每个字母数字,空格或点写入该缓冲区。
^\s*((?:\w|\s|\.)*)\s*$
有2个捕获组,因此它将整个文本捕获到组1(与外部(...)
),第二个捕获组是存储来自交替匹配的字符的组一个接一个地只有最后一个符号留在第二个缓冲区中。
解决方案是使用非捕获组进行替换,并使用捕获组来查找所有找到的子匹配:^\s*((?:\w|\s|\.)*)\s*$
。
介意这是非常低效的!尽可能使用字符类(即([\w\s.]*)
)。
答案 1 :(得分:0)
每个捕获组捕获与该组匹配的字符串。 ((\w|\s|\.)*)
匹配The quick...
,因此它会正确设置捕获的字符串。但是(\w|\s|\.)
匹配很多次,每个角色一次;然后,捕获的字符串是最后一个匹配,即文本末尾的.
。