【问题标题】:How does negative regex lookaround works when put in if clause?放入 if 子句时,负正则表达式环视如何工作?
【发布时间】:2020-03-03 01:00:46
【问题描述】:

我正在尝试使用正则表达式捕获组和环视来匹配序列中特定单词的所有实例,但前提是它没有被 & 和 ; 包围符号(即我不想从&word; 捕获word,但我从&wordword; 捕获)。

我写了一个我认为可以满足我的需求的正则表达式,但它没有——似乎我在 if 子句中放置的负面环顾四周只使第一组不匹配,而不是整个匹配。

(&[^;&]*)?(amp)(?(1)(?!;))

在此字符串上使用时:>amp; & amp & &amp< 我预计只有第一、第三和第五安培会被匹配,因为负环视,但出乎意料的是,它们都匹配,只有 & 被排除在 ; 之后。

https://regex101.com/r/ilAAVb/1

我是否在这里犯了一些明显的错误,或者 if 子句中的环顾四周仅适用于该子句正在检查的组?

编辑:更正了我需要从句子中提取的内容。

【问题讨论】:

    标签: regex regex-lookarounds regex-group


    【解决方案1】:

    使用(*FAIL)(*SKIP)动词,尝试匹配&word;,如果找到,丢弃匹配然后尝试匹配amp

    &.+?;(*SKIP)(*FAIL)|amp
    

    Demo & explanation

    【讨论】:

    • 感谢您的意见,这正是我想要的!我必须将&.+?; 更改为&[^&]*;,同时捕获可能出现在句子中间的&word
    • @Gynju:不客气,很高兴它有帮助。随意将答案标记为已接受,How to accept an answer
    【解决方案2】:

    也许不是最优雅的,但这很有效:

    (&\b\w+\b(?!;)|(?<!&)\b\w+\b(?!;)|(?<!&)\b\w+\b;)
    

    (&amp;\b\w+\b(?!;) 开头为&amp;,但结尾没有;

    (?&lt;!&amp;)\b\w+\b(?!;) 开头没有&amp;,结尾没有;

    (?&lt;!&amp;)\b\w+\b;) 开头没有&amp;,但结尾有;

    【讨论】:

    • 我想知道我是否应该编辑我的原始帖子,因为我现在看到了一个错误 - 在像 &amp;wordword; 这样的片段中,我只需要捕获 word 部分。 & 和 ;应该从捕获组中省略。
    • @Gynju 是的,请编辑并说明您需要的内容:模式解释(那么您的问题是重复的),或实际问题的解决方案。请解释真正的问题。
    • 如果你不想捕获 & 和 ;给你: (?:&(\b\w+\b(?!;))|(?
    • @Vincent 更接近我实际可以使用的东西:)。有没有办法将所有单词捕获到一个组中?我尝试使用命名组,但它们需要唯一的名称。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-28
    • 2016-04-26
    相关资源
    最近更新 更多