正则表达式问号

时间:2012-03-08 19:49:28

标签: php javascript regex

匹配字符串,如:

-TEXT-someMore-String

要获得-TEXT-,我才知道这有效:

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

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

colou?r匹配colourcolor

我最初使用正则表达式来获取-TEXT-这样的部分:

/-(.+)-/

但它给了-TEXT-someMore-

添加?如何停止正则表达式以正确获取-TEXT-部分?因为它曾经使前面的令牌可选择不停止在某个点,如上例所示?

4 个答案:

答案 0 :(得分:9)

正如你所说,?有时意味着“零或一”,但在你的正则表达式中+?是一个单位,意思是“一个或多个 - 并且最好尽可能少”。 (这与裸+形成对比,这意味着“一个或多个 - 并且最好尽可能多”。)

正如the documentation所说:

  

但是,如果量词后跟一个问号,      然后它变得懒惰,而是匹配最小值      可能的次数,因此模式/\*.*?\*/      用C评论做正确的事情。的意思      各种量词都没有改变,只是首选      比赛数量。不要混淆这种用法      问号用作量词本身。      因为它有两种用途,它有时会出现加倍,如      在\d??\d中,按优先级匹配一个数字,但可以匹配两个if      这是模式其余部分匹配的唯一方式。

答案 1 :(得分:3)

或者,您可以使用 U ngreedy修饰符设置整个正则表达式,以便尽可能缩短搜索范围:

/-(.+)-/U

答案 2 :(得分:2)

在令牌是{0,1}的简写之前

?,这意味着:从0到1的任何一个出现最重要的。

但是+不是一个标记,而是一个量词。 {1,}的简写:1直到无穷无尽的外表。

A?在量词将其设置为非同意模式之后。如果处于贪婪模式,它会尽可能多地匹配字符串。如果非贪婪它尽可能少匹配

答案 3 :(得分:1)

另一个,也许你的正则表达式中的潜在错误是你尝试通过.+?匹配许多任意字符。但是,你真正想要的可能是:"除了 - "之外的任何角色。您可以通过[^-]+获得该信息。在这种情况下,如果您进行贪婪的比赛并不重要 - 重复的比赛将在您遇到第二个时立即终止" - &# 34;在你的字符串中。