【问题标题】:How regex lookaround works when used alone单独使用时正则表达式环视如何工作
【发布时间】:2015-08-08 02:18:30
【问题描述】:
public class Test {
    public static void main(String[] args){
        Pattern a = Pattern.compile("(?=\\.)|(?<=\\.)");
        Matcher b = a.matcher(".");
        while (b.find()) System.out.print("+");
    }
}

我一直在阅读 Regular-Expressions.info 上的环视部分,并试图弄清楚它是如何工作的,但我被这件事困住了。当我运行上面的代码时,结果是 ++,我不明白,因为“。”是与模式匹配的唯一标记,显然“。”后面或前面没有任何内容。那怎么能匹配两次呢?

【问题讨论】:

  • @hwnd 我明白环视不消耗任何标记,但我不明白的是,“。”后面或前面没有标记,因为我只有lookbehind和前瞻而不是 \\.在我编译的模式中,我认为它不应该匹配任何东西,但它会匹配两次。
  • ^^^ 由于zero-width 的位置,您将获得两场比赛。
  • @hwnd 很抱歉一直打扰你...不是零宽度意味着它是一个断言(应该在当前位置之前或之后有一段时间),它不会消耗任何令牌?(stackoverflow.com/questions/3275375/zero-width-token)我不明白你所说的零宽度位置是什么意思......你的意思是像“。”之前和之后的空白。 ?
  • @hwnd 哎呀...我在聊天中的声誉很低...谢谢您的帮助!我会试着弄清楚你在那篇帖子中所说的内容,当我有更高的声誉时可能会回来......
  • 正则表达式:(?=\.)|(?&lt;=\.) 用英文表示:“匹配字符串中紧接在句点之前或之后的位置” 换句话说,零宽度断言匹配字符串中的 positionlocation。如果字符串中有一个句点,则将有两个位置匹配 - 一个在前面,一个在后面。

标签: java regex regex-lookarounds


【解决方案1】:

随着正则表达式引擎在输入中前进,它会将字符 位置之前和之后 字符视为输入中的不同位置。

您的输入有 3 个位置:

  1. 就在第一个字符之前
  2. 第一个字符
  3. 就在第一个字符之后

位置 1 匹配 (?=\\.)
位置 3 匹配 (?&lt;=\\.)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-03
    • 2022-01-11
    • 1970-01-01
    • 2017-06-11
    • 1970-01-01
    • 1970-01-01
    • 2016-04-26
    相关资源
    最近更新 更多