我需要在第一次出现的括号内的关键字后面的文本中找到一些字符串。 这是文本示例:
Lorem ipsum dolor sit amet,consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua。 === FIRST KEYWORD === veniam, {{text need to get}} ullamco laboris nisi ut aliquip ex ea commodo consequat。 Duis aute irure 在rephenderit {{in voluptate velit esse cillum}} dolore eu fugiat nulla pariatur。 Excepteur sint occaecat cupidatat non proident,sunt in culpa qui officia {{deserunt mollit anim}} id est laborum
所以我需要在第一个关键字后的括号内找到文字。
我尝试了很多组合,但最好的是我收到了最后一个括号中的文字而不是第一个。有了这个exp,我在关键字(?<==== FIRST KEYWORD ===).(.|\n)*
之后得到了文字
但是,在括号中找到第一个文本后,我没有成功。
"(?<==== FIRST KEYWORD ===)[^{]*\\{\\{([^}]*)\\}\\}"
有效,但我现在没有看到。所以我不能说感谢那个写这个的人,我不记得了。
答案 0 :(得分:3)
此代码提取您的目标:
String target = input.replaceAll("(?s).*?=== FIRST KEYWORD ===.*?\\{\\{(.*?)\\}\\}.*", "$1");
正则表达式的重要部分是使用不情愿的量词.*?
,它将在第一个可用匹配时停止消耗输入(不会跳过它到后续匹配)。
注意(感谢@guido指出这一点)已经添加了 dotall 标志(?s)
,这允许点匹配跨行运行 - 工作时需要多行输入。
一些测试代码,使用您的示例的缩写形式:
String input = "one two === FIRST KEYWORD === three {{xxx}} four {{yyy}} five";
String target = input.replaceAll("(?s).*?=== FIRST KEYWORD ===.*?\\{\\{(.*?)\\}\\}.*", "$1");
System.out.println(target);
输出:
xxx
答案 1 :(得分:0)
选项1:如果您想要{{text AND the braces}}
String ResultString = null;
try {
Pattern regex = Pattern.compile("=== FIRST KEYWORD ===[^{]*?(\\{\\{(?:.(?!}}))*.}})", Pattern.DOTALL);
Matcher regexMatcher = regex.matcher(subjectString);
if (regexMatcher.find()) {
ResultString = regexMatcher.group(1);
}
} catch (PatternSyntaxException ex) {
// Syntax error in the regular expression
}
选项2:如果您想匹配{{text but NOT the braces
}}
String ResultString = null;
try {
Pattern regex = Pattern.compile("=== FIRST KEYWORD ===[^{]*?\\{\\{((?:.(?!}}))*.)}}", Pattern.DOTALL);
Matcher regexMatcher = regex.matcher(subjectString);
if (regexMatcher.find()) {
ResultString = regexMatcher.group(1);
}
} catch (PatternSyntaxException ex) {
// Syntax error in the regular expression
}