【问题标题】:Don't know how to use lookarounds properly to achieve my Regex match不知道如何正确使用环视来实现我的正则表达式匹配
【发布时间】:2014-05-30 18:20:37
【问题描述】:

我正在编写一个 perl 脚本,其中一部分要求我匹配字符串中某个模式的所有出现。自然地,正则表达式似乎足够强大,但我就是无法正确处理这个特定的字符串。

正则表达式可能应用于的文本类型的假设示例是:

1cat;2dog;!3monkey;!4horse;

如您所见,行中存在多个数据条目(1cat、2dog 等),以分号分隔。行首不包含分号,但行尾包含分号。我希望能够匹配所有没有被 ! 删除的东西。在上面的示例中,1cat 和 2dog 将在列表上下文中匹配并返回,而 3monkey 和 4horse 则不会。

到目前为止,我尝试做的是使用否定的lookbehinds 来只注意没有!的条目。像这样的:

m/(?<!\!)(\w+)\;/g

但是,它不起作用,因为对于每个 !'ed 条目,正则表达式只匹配它后面的内容,直到分号。在示例中,捕获了 1cat 和 2dog,但随后捕获了猴子和马。

我觉得这很容易做到,但我是正则表达式的新手,我想不出别的。

【问题讨论】:

    标签: regex perl delimiter regex-lookarounds


    【解决方案1】:

    在其中输入word boundary (\b)you should be good

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

    正如您所知道的,您的负面观察正在工作,但它仍然会匹配下一个字符之后的所有内容(horse 来自!4horse)。单词边界是一个零宽度断言,有点像一个不匹配任何东西的条件(如锚^$)。它为此断言:(^\w|\w\W|\W\w|\w$)。换句话说,任何时候单词字符 ([a-zA-Z0-9_]) 都紧邻字符串的开头/结尾或非单词字符。

    【讨论】:

    • 哦,我现在明白了,它避免匹配像猴子和马这样的条目,因为它们不包含单词边界,就像真正的匹配应该在它们的开头一样。也适用于第一个条目,因为它与字符串的前面作为单词边界匹配,对吗?
    • @DDP 抱歉,我错过了评论,这是正确的。如果您只是将\w+; 与否定的lookbehind 断言匹配以确保它前面没有!horse 匹配没有问题(它是1+ 个单词字符并且前面是4 而不是@987654335 @)。但是,4 -> h 不是单词边界,因为它们都是单词字符。是的,1cat 仍然匹配,因为 ^ -> 1 是一个单词边界。
    猜你喜欢
    • 2012-12-22
    • 1970-01-01
    • 2010-10-03
    • 2012-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多