【发布时间】: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 哎呀...我在聊天中的声誉很低...谢谢您的帮助!我会试着弄清楚你在那篇帖子中所说的内容,当我有更高的声誉时可能会回来......
-
正则表达式:
(?=\.)|(?<=\.)用英文表示:“匹配字符串中紧接在句点之前或之后的位置” 换句话说,零宽度断言匹配字符串中的 position 或 location。如果字符串中有一个句点,则将有两个位置匹配 - 一个在前面,一个在后面。
标签: java regex regex-lookarounds