Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java正则表达式,查找其中的文本_Java_Regex_Expression - Fatal编程技术网

Java正则表达式,查找其中的文本

Java正则表达式,查找其中的文本,java,regex,expression,Java,Regex,Expression,我需要在第一次出现的括号内的关键字之后的文本中找到一些字符串。 以下是文本示例: Lorem ipsum dolor sit amet,奉献精英, 这是临时性的劳动和就业机会。 ===第一个关键字===veniam, {{text need to get}ullamco laboris nisi ut aliquip ex ea commodo consequat。酒后驾车 这是一个非常好的例子。除非圣奥卡塔特无过失,必须 这是我的错 因此,我需要在第一个关键字之后的括号内获取文本 我尝试了许多

我需要在第一次出现的括号内的关键字之后的文本中找到一些字符串。 以下是文本示例:

Lorem ipsum dolor sit amet,奉献精英, 这是临时性的劳动和就业机会。 ===第一个关键字===veniam, {{text need to get}ullamco laboris nisi ut aliquip ex ea commodo consequat。酒后驾车 这是一个非常好的例子。除非圣奥卡塔特无过失,必须 这是我的错

因此,我需要在第一个关键字之后的括号内获取文本


我尝试了许多组合,但最好的是我收到了最后一个括号中的文本,而不是第一个括号中的文本。通过这个exp,我在关键字
(?这个代码提取你的目标后得到了文本:

String target = input.replaceAll("(?s).*?=== FIRST KEYWORD ===.*?\\{\\{(.*?)\\}\\}.*", "$1");
正则表达式的重要部分是使用不情愿的量词
*?
,它将在第一个可用匹配时停止使用输入(而不是跳过输入到后续匹配)

编辑: 请注意(感谢您指出这一点),添加了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:如果需要
{{text和大括号}}

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:如果要匹配{{
文本而不是大括号
}

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
}

除了用于分隔搜索文本的双大括号外,文本中还会有单大括号吗?我有两个大括号{{}.+1的分隔符,因为与其他解决方案相比,当在
{{{
前面有一个
{
时,这不会触发。
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
}