【问题标题】:Antimatch with Regex与正则表达式的反匹配
【发布时间】:2011-06-07 08:16:20
【问题描述】:

我搜索一个正则表达式模式,它不应该匹配一个组,而是其他所有内容。
以下正则表达式模式基本有效:

index\.php\?page=(?:.*)&tagID=([0-9]+)$

但是.* 不应该匹配TaggedObjects

感谢您的任何建议。

【问题讨论】:

  • 标记对象?那是它不应该匹配的字符串吗?

标签: regex pcre


【解决方案1】:

试试这个。我认为您的意思是,如果字符串包含出现“TaggedObjects”,则您希望匹配失败

index\.php\?page=(?!.*TaggedObjects).*&tagID=([0-9]+)$

【讨论】:

    【解决方案2】:

    (?:.*) 是不必要的——你没有对任何东西进行分组,所以.* 的意思完全一样。但这不是您问题的答案。

    要匹配任何不包含另一个预定义字符串(比如TaggedObjects)的字符串,请使用

    (?:(?!TaggedObjects).)*
    

    在你的例子中,

    index\.php\?page=(?:(?!TaggedObjects).)*&tagID=([0-9]+)$
    

    将匹配

    index.php?page=blahblah&tagID=1234
    

    不会匹配

    index.php?page=blahTaggedObjectsblah&tagID=1234
    

    如果您确实希望允许该匹配并且只排除确切的字符串 TaggedObjects,则使用

    index\.php\?page=(?!TaggedObjects&tagID=([0-9]+)$).*&tagID=([0-9]+)$
    

    【讨论】:

    • 根据您的第一点,它可能只是(?!TaggedObjects).*
    • @SilentGhost:不,重复在组之外(为了在后面的每个位置应用负前瞻)。 (?:(?!TaggedObjects).)* 的替代方案是 (?!.*TaggedObjects).*。不过。
    • 我认为在被动组 (?:) 中放置负前瞻 (?!) 没有意义,因为无论如何都不会捕获负前瞻。为什么要放一个“。”在被动组里面?为什么不 .*?
    • @Jass:请参阅我之前的评论 - 它确保在比赛中的每个位置都应用前瞻,而不仅仅是开始。但是(?!.*TaggedExpression) 也有效(正如我在上面写的)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 2016-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-02
    相关资源
    最近更新 更多