【问题标题】:Regex question mark正则表达式问号
【发布时间】:2023-03-29 02:12:02
【问题描述】:

用如下模式匹配一​​个字符串:

-TEXT-someMore-String

为了得到-TEXT-,我知道这是可行的:

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

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

colou?r 匹配 colourcolor

我最初输入正则表达式来获取-TEXT- 部分,如下所示:

/-(.+)-/

但它给了-TEXT-someMore-

添加? 如何停止正则表达式以正确获取-TEXT- 部分?因为它曾经使前面的标记是可选的,而不是像上面的例子那样在某个点停止?

【问题讨论】:

    标签: php javascript regex


    【解决方案1】:

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

    正如the documentation 所说:

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

    【讨论】:

    • 是的。 +* 被称为“贪婪”运算符:它们消耗尽可能多的东西。相比之下,+?*? 是“非贪婪”版本:它们消耗尽可能少的东西。在网上搜索“regex greedy nongreedy”以获取更多信息/教程。
    • @EdwardLoper 可惜我不能喜欢 cmets。我会将您的评论复制到 .txt :D
    【解决方案2】:

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

    /-(.+)-/U
    

    【讨论】:

      【解决方案3】:

      ? 之前的一个标记是 {0,1} 的简写,这意味着:从 0 到 1 出现的任何东西都是最重要的。

      但是+不是一个记号,而是一个量词。 {1,} 的简写:1 直到无限次出现。

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-07-31
          • 1970-01-01
          • 2012-08-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多