我希望在一系列后缀之后提取(目前使用Java内置的Regex)文本。 我正在使用lookbehind技术,但我得到的结果似乎总是最长的结果,而不是匹配前缀文本的第一个交替组的匹配。
即,
(?<=Book name|Book).*
给出文字"Book name Story"
无论正则表达式的轮换方向如何,匹配始终为"name Story"
。
我的问题是,在没有匹配任何其他文本的情况下,获取"Story"
文本的最佳方法是什么?
在实践中,我希望通过前瞻来限制右手边(只是在相关的情况下)。
答案 0 :(得分:1)
您可以使用占有量词来强制首先使用单词“name”测试lookbehind中的子模式,例如:
(?<=Book (?:name )?+)\S+
请注意,这是Java正则表达式引擎的一种奇怪行为。似乎模式的测试类似于:(?:Book (?:name )?+)\S+
并且正则表达式引擎忘记给出第一个可能的结果。 (“正常行为”应该在左边给出第一个“名字”的结果)
答案 1 :(得分:0)
你可以在这里使用前瞻。
(?<=Book name |Book )\S+(?=$)
OR
(?<=Book name )\S+|(?<=Book )(?!name)\S+
Java正则表达式,
"(?<=Book name |Book )\\S+(?=$)"
OR
"(?<=Book name )\\S+|(?<=Book )(?!name)\\S+"
代码:
String s = "Book name Story";
Pattern regex = Pattern.compile("(?<=Book name |Book )\\S+(?=$)");
Matcher regexMatcher = regex.matcher(s);
if (regexMatcher.find()) {
String ResultString = regexMatcher.group();
System.out.println(ResultString);
}//=> Story
<强>解释强>
(?<=Book name |Book )
Looknbehind将匹配标记设置在字符串Book name
或Book
之后。\S+
匹配一个或多个非空格字符。(?=$)
Lookahead断言以下必须是行尾。答案 2 :(得分:0)
您可以使用占有量词技巧:
(?<=(?:Book name |Book ){1}+).*
^^^^
的更多详情