答案 0 :(得分:0)
两者都可以正常工作,但在嵌套组之前需要一个空格。
如果文本是例如Activity
,那么正则表达式将起作用。但是您发布的链接中的示例如:Jan1987
尝试:
Jan 1987
答案 1 :(得分:0)
对于此^(.+(\d+))$
如果我们在(.+)
周围放置一个捕获组
从输出中我们看到,对于.+
,引擎最初匹配
整个字符串Jan 1987
然后一次回溯1个字符,直到
它可以满足下一个子表达式(\d+)
它找到字符7
并看到它满足表达式
它完成了它的工作,所有子表达式都得到满足,所以它就停止了。
这是贪心量词的典型行为。 有些事情可能会破坏这种行为:
在表达式中添加非贪婪的限定词?
:
看起来像(.+?)
。这样做不是最初匹配的
整个字符串,它一次增量匹配1个字符
每次匹配一个字符时,它会检查下一个字符以查看它是否为
将匹配 next 子表达式\d+
。既然如此,它会留下当前的子表达式.+?
并继续下一个\d+
该过程继续进行下一个子表达式等。
任何时候它一直失败,引擎返回上一个成功的子表达式,在其先前成功的匹配位置,
然后减少匹配位置的,然后重复整个过程
它可以一直回到第一个子表达式
进程...这称为回溯。
保留贪婪的子表达式.+
,但在某些点添加
在下一个子表达式之前的已知文字字符
这些是引擎锚定的航路点,称为伪锚
它扰乱了回溯。例如,您可以添加空格字母
就在\d+
子表达式之前,例如^(.+ (\d+))$
。这迫使了
从最后一个数字开始回溯,返回直到找到空格,让\d+
消耗所有年份数字。
保持贪心,但减少子表达式中允许的字符
而不是使用 Dot 元字符(匹配任何字符),请指定
一类有限的人物。
一般来说,使用 Dot 元字符,你不在乎什么是什么
那里,或者不知道那里有什么。它总是比班级快。
但是,在使用它时,尝试在中使用伪锚的策略
以下子表达式。这将允许发动机归零,在哪里
匹配主题文本的右侧框架点。
^
( # (1 start)
( .+ ) # (2)
( \d+ ) # (3)
) # (1 end)
$
输出:
** Grp 0 - ( pos 0 , len 8 )
Jan 1987
** Grp 1 - ( pos 0 , len 8 )
Jan 1987
** Grp 2 - ( pos 0 , len 7 )
Jan 198
** Grp 3 - ( pos 7 , len 1 )
7