【问题标题】:Regex - Why does the question mark behave like this?正则表达式 - 为什么问号的行为是这样的?
【发布时间】:2017-01-11 17:53:21
【问题描述】:

我正在学习正则表达式。当我匹配这个时:

\d[^\w]\d

关于这个

30-01-2003 15:20

我得到 3 场比赛:0-0、1-2、3 5 和 5:2。 当我尝试在正则表达式 (\d[^\w]\d?) 的末尾添加问号时,我的匹配项不会改变。 当我将问号移到方括号 (\d[^\w]?\d) 之后时,匹配项现在是 30、01、20、03、15 和 20。 当我将问号移到方括号 (\d?[^\w]\d) 之前时,我的匹配项与第一种情况相同。

这是为什么?我知道? 运算符将前面的字符标记为可选,所以我预计第二种情况下的行为,但不是第一种或第三种情况。

【问题讨论】:

  • 如果你不知道 regex101.com 可以很好地解析和解释正则表达式。
  • 谢谢。我去看看

标签: regex


【解决方案1】:

因为? 是一个贪心匹配。它将尝试尽可能多地消耗。因此,如果存在 \d,它将始终抓住它。

将末尾的 ? 视为定义了两个正则表达式:\d[^\w]\d\d[^\w]。在您的测试用例中,您永远不会遇到第一个正则表达式不匹配而第二个正则表达式匹配的匹配项(没有重叠,这又是贪婪的)。这就是为什么你的比赛永远不会改变。但是,如果您将测试用例更改为:

30-01-2003 15:20/

你会得到一个额外的0/ 匹配,这取决于你是否在正则表达式的末尾包含问号。

【讨论】:

  • * 也很贪心吗?
  • 是的。要使占有欲和不贪婪,请在它们后缀+,例如?+*+.
【解决方案2】:

您的第一种和第三种情况会产生与原始情况相同的结果,只是因为您正在搜索的特定字符串 - 它们通常不是等效的搜索。具体来说,您的字符串中每次出现\d[^\w] 都会后跟一个数字,因此将尾随数字设为可选不会更改任何匹配项。同样,[^\w]\d 的每次出现都恰好前面有一个数字。如果您的字符串有两个空格,或者某处有双标点符号,则每种情况的结果都会有所不同。

【讨论】:

    【解决方案3】:

    你只需要它

    -两种解决方案-

    1.正则表达式:

    \d+ 
    

    1.说明:

    \d =>numbers
    + => 1 or more
    

    2。正则表达式

    [0-9]+
    

    2。说明

    [0-9] <= Numbers
    + <= 1 or more
    

    它将匹配所有数字(解决方案 1 或 2)

    原文:

    30-01-2003 15:20
    

    结果:

    30
    01
    2003
    15
    20
    

    享受吧。

    见:https://regex101.com/r/xXaLgN/6

    【讨论】:

    • 虽然你做了(某种程度上)解释了 \d+,但这不是问题所在。
    • 我正在解释如何捕捉数字,如果你符合否定的条件,当我试图帮助知识时,就会失去动力。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-08
    • 1970-01-01
    • 2013-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多