我正在使用regexps +一些手动解析在Java中解析一个相对复杂的表达式.我现在正在做的是删除我已经从字符串中解析的内容,所以我接下来要在字符串的开头解析.
我想改变这个,所以我有一个int pos变量,我不修改字符串.但是,类Pattern和Matcher类似乎都没有标记要匹配的第一个字符的索引.有什么办法吗?
(我知道我可以传递str.substring(pos)给它Matcher,但我想它会更昂贵,并且使我的代码变得复杂一点,因为我经常使用start()和end()方法).
A java.util.regex.Matcher尝试在区域上查找匹配项,默认为整个输入,但可以显式设置为特定的子范围.
从文档:
匹配器在其输入的子集中查找称为区域的匹配.默认情况下,该区域包含所有匹配器的输入.可以通过该
region(int start, int end)方法修改该区域,并通过regionStart和regionEnd方法查询.可以更改区域边界与某些模式构造交互的方式.见useAnchoringBounds和useTransparentBounds更多的细节.
请记住,与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使用锚定和不透明边界.这适用于大多数子区域匹配方案,但您可以根据需要设置自己的组合.