Java regexp:从输入中间的给定点精确匹配

Java regexp:从输入中间的给定点精确匹配,java,regex,Java,Regex,我有一个输入字符串,需要在其上运行几个regexp模式(某种解析器)。当运行这些ReXEPS时,我只想考虑字符串的某个部分(从给定的位置直到其结束),并且只有当输入匹配在给定位置开始时,才希望模式匹配。p> 假设输入字符串是abcdefghij,当前位置是1,我有这两种模式 p1:[b-d]+ p2:[h-j]+ 假设我的位置是1,那么我希望p1匹配,我希望p2不匹配(因为p2匹配输入的hij部分-也就是说:匹配从位置7开始,而不是从位置1开始) 使用Matcher.find(offset)

我有一个输入字符串,需要在其上运行几个regexp模式(某种解析器)。当运行这些ReXEPS时,我只想考虑字符串的某个部分(从给定的位置直到其结束),并且只有当输入匹配在给定位置开始时,才希望模式匹配。p> 假设输入字符串是
abcdefghij
,当前位置是
1
,我有这两种模式

  • p1:
    [b-d]+
  • p2:
    [h-j]+
假设我的位置是
1
,那么我希望
p1
匹配,我希望
p2
不匹配(因为
p2
匹配输入的
hij
部分-也就是说:匹配从位置
7
开始,而不是从位置
1
开始)

使用
Matcher.find(offset)
不起作用,因为它不需要在给定位置开始匹配:

// Output: true (whereas I want it to be false)
System.out.println(Pattern.compile("[h-j]+").matcher("abcdefghij").find(1));
请注意,将
^
添加到我的模式并不能解决问题:

// Output: false (whereas I want it to be true)
System.out.println(Pattern.compile("^[b-e]+").matcher("abcdefghij").find(1));
其他备选方案(不起作用):

(1) 在我的输入字符串上应用
.substring()
(并将
^
添加到我的模式中)会起作用,但
.substring()
的复杂性为O(n),这对我来说可能是个问题(这是一个库代码,将用于潜在的大输入,我无法预先预测)

(2) 我可以使用matcher的object
.start()
方法确定匹配发生的位置,如下所示:

matcher = Pattern.compile("[h-j]+").matcher("abcdefghij");
System.out.println(matcher.find(1) && matcher.start() == 1);

我的问题是,regexp算法将在整个输入字符串(可能很长)中运行,只有在找到匹配项后,
matcher.start()==offset
条件才会拒绝匹配项,如果它不在所需位置。似乎效率低下。

使用
Matcher.lookingAt()
将锚定在起点而不是终点(与不锚定的
find
不同)

具体而言:

Matcher m = Pattern.compile(".....").matcher(input);
m.region(offset, input.length());
if (m.lookingAt()) { 
  ...
}