我希望在一系列后缀之后提取文本(目前使用Java构建在Regex中)。我正在使用查找技术,但是我得到的结果似乎总是最长的结果,而不是第一个替换组匹配前缀文本的结果。
那是,
(?<=Book name|Book).*
给定文本"Book name Story"
无论regex交替是哪种方式,匹配始终是"name Story"
。我在这里的问题是,在不匹配任何其他文本的情况下,获得"Story"
文本的最佳方法是什么?在实践中,我也希望通过放眼来限制右手边(以防万一)。
发布于 2014-08-05 04:15:05
你可以在这里看一看。
(?<=Book name |Book )\S+(?=$)
或
(?<=Book name )\S+|(?<=Book )(?!name)\S+
Java正则表达式是,
"(?<=Book name |Book )\\S+(?=$)"
或
"(?<=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 )
查找后将匹配标记设置为字符串Book name
或Book
。\S+
匹配一个或多个非空格字符。(?=$)
查找前断言以下内容必须是行结束。发布于 2014-08-05 04:22:58
您可以使用所有格量词强制使用"name“一词首先测试lookbehind中的子模式,例如:
(?<=Book (?:name )?+)\S+
请注意,这是Java正则表达式引擎的一种奇怪行为。这个模式似乎被测试为:(?:Book (?:name )?+)\S+
,正则表达式引擎忘记给出第一个可能的结果。(“正常行为”应该给出左边的第一个结果,即“名称”)
发布于 2014-08-05 04:31:51
您可以使用拥有式量词技巧。
(?<=(?:Book name |Book ){1}+).*
^^^^
https://stackoverflow.com/questions/25138534
复制