Java regexp:从输入中间的给定点精确匹配
我有一个输入字符串,需要在其上运行几个regexp模式(某种解析器)。当运行这些ReXEPS时,我只想考虑字符串的某个部分(从给定的位置直到其结束),并且只有当输入匹配在给定位置开始时,才希望模式匹配。p> 假设输入字符串是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)
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()) {
...
}