在Java中的字符串中间启动正则表达式匹配

dis*_*ose 2 java regex

我正在使用regexps +一些手动解析在Java中解析一个相对复杂的表达式.我现在正在做的是删除我已经从字符串中解析的内容,所以我接下来要在字符串的开头解析.

我想改变这个,所以我有一个int pos变量,我不修改字符串.但是,类PatternMatcher类似乎都没有标记要匹配的第一个字符的索引.有什么办法吗?

(我知道我可以传递str.substring(pos)给它Matcher,但我想它会更昂贵,并且使我的代码变得复杂一点,因为我经常使用start()end()方法).

pol*_*nts 7

A java.util.regex.Matcher尝试在区域上查找匹配项,默认为整个输入,但可以显式设置为特定的子范围.

从文档:

匹配器在其输入的子集中查找称为区域的匹配.默认情况下,该区域包含所有匹配器的输入.可以通过该region(int start, int end)方法修改该区域,并通过regionStartregionEnd方法查询.可以更改区域边界与某些模式构造交互的方式.见useAnchoringBoundsuseTransparentBounds更多的细节.

请记住,与Java库类中的许多方法一样,start索引是包容性的,end索引是独占的.


片段

这是一个示例用法:

    String text = "012 456 890 234";
    Pattern ddd = Pattern.compile("\\d{3}");
    Matcher m = ddd.matcher(text).region(3, 12);
    while (m.find()) {
        System.out.printf("[%s] [%d,%d)%n",
            m.group(),
            m.start(),
            m.end()
        );
    }
Run Code Online (Sandbox Code Playgroud)

以上打印(如ideone.com上所示):

[456] [4,7)
[890] [8,11)
Run Code Online (Sandbox Code Playgroud)

关于锚定边界和透明边界

如前所述,当您指定区域时,可以根据需要更改某些模式构造的行为.

一个约束锚固使得区域匹配各种的边界的边界匹配器(^,$等).

一个结合的不透明基本上切断输入的从向前看符号,lookbehinds和某些边界匹配结构的其余部分.另一方面,在透明模式下,允许他们根据需要查看区域外的字符.

默认情况下,a Matcher使用锚定不透明边界.这适用于大多数子区域匹配方案,但您可以根据需要设置自己的组合.