Java中的lookbehind交替似乎是返回最长的结果

时间:2014-08-05 12:12:18

标签: regex regex-lookarounds lookbehind

我希望在一系列后缀之后提取(目前使用Java内置的Regex)文本。 我正在使用lookbehind技术,但我得到的结果似乎总是最长的结果,而不是匹配前缀文本的第一个交替组的匹配。

即,

(?<=Book name|Book).*

给出文字"Book name Story"

无论正则表达式的轮换方向如何,匹配始终为"name Story"。 我的问题是,在没有匹配任何其他文本的情况下,获取"Story"文本的最佳方法是什么? 在实践中,我希望通过前瞻来限制右手边(只是在相关的情况下)。

3 个答案:

答案 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+"

DEMO 1

DEMO 2

代码:

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 nameBook之后。
  • \S+匹配一个或多个非空格字符。
  • (?=$) Lookahead断言以下必须是行尾。

答案 2 :(得分:0)

您可以使用占有量词技巧

(?<=(?:Book name |Book ){1}+).*
                        ^^^^

http://www.regular-expressions.info/possessive.html

的更多详情