Regex question mark



将字符串与以下模式匹配:

-TEXT-someMore-String

为了得到-TEXT-,我知道这是有效的:

/-(.+?)-/ // -TEXT-

据我所知,?将前面的标记作为可选标记,如:

colou?rcolourcolor 都匹配

我最初放入regex以获得-TEXT-部分,如下所示:

/-(.+)-/

但它给出了-TEXT-someMore-

添加?如何停止regex以正确获得-TEXT-部分?既然它曾经让前面的令牌是可选的,而不是像上面的例子那样在某个点停止?

正如您所说,?有时意味着"零或一",但在正则表达式中,+?是一个单一的单元,意思是"一个或多个—最好尽可能少"。(这与裸+形成对比,后者的意思是"一个或多个,最好尽可能多"。)

正如文件所说:

但是如果一个量词后面跟着一个问号,然后它变得懒惰,而是匹配最小值可能的次数,因此模式/*.*?*/用C注释做正确的事情。各种量词在其他方面没有改变,只是首选匹配数。不要混淆问号本身就是一个量词。因为它有两种用途,所以有时会出现双重用途,如在d??d中,按偏好匹配一个数字,但如果这是其余模式匹配的唯一方式。

或者,您可以使用Ungreedy修饰符来设置整个正则表达式,以便搜索尽可能短的匹配:

/-(.+)-/U

标记之前的?是{0,1}的简写,意思是:从0到1的任何值都是最重要的。

+不是一个表征,而是一个量词。{1,}:1的简写,最多出现无数次。

A?在一个量词将其设置为非自由模式之后。如果在贪婪模式下,它会匹配尽可能多的字符串。如果不是贪婪的,它匹配尽可能少的

正则表达式中的另一个潜在错误可能是您试图通过.+?匹配多个任意字符。然而,你真正想要的可能是:"除了-之外的任何字符"。你可以通过[^-]+获得。在这种情况下,是否进行贪婪匹配并不重要——只要你遇到字符串中的第二个"-",重复匹配就会终止。

最新更新