【问题标题】:Regex - Understanding negated character classes正则表达式 - 了解否定字符类
【发布时间】:2014-11-21 00:19:34
【问题描述】:

当我查看正则表达式的权威教程网站时,否定字符类的定义总是类似于“匹配所有不在列表中的字符”。然而在这个简单的例子中:"abc;xyz" -match "([^;]+)",我希望匹配是“abcxyz”,但它不是(匹配所有不是分号的字符)。那么定义应该是“匹配所有不在列表中的字符,但直到它在该列表中找到一个字符”?

【问题讨论】:

  • 尝试"aba" 和正则表达式a+。它与否定字符类无关。

标签: regex


【解决方案1】:

Regex 引擎匹配“a”。然后它贪婪地匹配'b',然后贪婪地匹配'c'。

然后正则表达式引擎点击';'并且不能再进一步,所以只有 'abc' 匹配。

【讨论】:

    【解决方案2】:

    它应该是“匹配 any 不在列表中的字符”或“当且仅当它不在列表中时匹配​​一个字符”。要意识到的重要一点是,一个字符类只会匹配一个字符。

    在您的示例中,您匹配多个字符,因为您添加了+。对于任何正则表达式r,正则表达式r+ 匹配r 的一个或多个连续 匹配项。因此[^;]+ 匹配abc,因为这是“abc;xyz”的最大、最早的子字符串,其中每个字符都匹配[^;]

    请注意,任何正则表达式都不会匹配不存在的子字符串。那就是没有正则表达式可以匹配“abc;xyz”中的“abcxyz”,因为“abcxyz”不是“abc;xyz”的子字符串。

    【讨论】:

    • 那么当使用量词时,它只会返回一个连续的子字符串?在正则表达式“替换”函数中不是这种情况吗,例如this 建议一个表达式可以匹配多个子字符串甚至单个字符。
    • @Lembasts 正则表达式的匹配将永远是一个连续的子字符串。根据您的语言/正则表达式库,有些函数采用正则表达式并返回其第一个匹配项,然后有些函数采用正则表达式并返回所有非重叠匹配项。同样,有替换单个匹配的函数,然后替换每个匹配的函数。这仅取决于您使用的功能。
    • 谢谢。对于另一个扩展的解释,我刚刚找到this
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-04
    • 1970-01-01
    • 1970-01-01
    • 2011-10-10
    • 2014-01-15
    • 2014-04-19
    相关资源
    最近更新 更多