如何在java中提取前两个字符和后两个字符之间的字符串?

如何在java中提取前两个字符和后两个字符之间的字符串?,java,regex,Java,Regex,已编辑:我想提取开头和结尾两个特殊字符之间的字符串 输入可以是以下内容之一: {[TestString]} {TestString} [TestString] [TestString]} {[TestString 预期输出:TestString 这里的特殊字符{,[,],}是可选的。输入字符串的开头和结尾可以有/没有这些特殊字符 在Pattern.compile()中使用下面的正则表达式,我没有得到预期的结果 (?=\[\\{)(.*?(=\]\})您在本应使用lookbehind的位置使用了先

已编辑:我想提取开头和结尾两个特殊字符之间的字符串

输入可以是以下内容之一:
{[TestString]}
{TestString}
[TestString]
[TestString]}
{[TestString

预期输出:
TestString

这里的特殊字符
{
[
]
}
是可选的。输入字符串的开头和结尾可以有/没有这些特殊字符

Pattern.compile()
中使用下面的正则表达式,我没有得到预期的结果


(?=\[\\{)(.*?(=\]\})

您在本应使用lookbehind的位置使用了先行断言。字符类确保
[{
]}
中的任何一个匹配:

(?<=[{\[])(.*?)(?=[]}])

(?您可以使用此正则表达式:

[\[{]*([^\]\[{}]+)[]}]*

正则表达式详细信息:

import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Stream;

public class Main {
    public static void main(String[] args) {
        //Test
        
        Stream.of(
                "{[TestString]}", 
                "{TestString}", 
                "[TestString]", 
                "[TestString]}", 
                "{[TestString"
        ).forEach(s -> System.out.println(s + " => " + getToken(s)));       
    }
    static String getToken(String s) {
        Matcher matcher = Pattern.compile("[\\[{]*([^\\]\\[{}]+)[]}]*").matcher(s);
        String token="";
        if(matcher.find()) {
            token = matcher.group(1);
        }
        return token;
    }
}
{[TestString]} => TestString
{TestString} => TestString
[TestString] => TestString
[TestString]} => TestString
{[TestString => TestString
  • [\[{]*
    :匹配0个或多个
    [
    {
    字符
  • ([^\]\[{}]+)
    :匹配不属于
    [
    ]
    {
    }
    的任何字符中的一个或多个。在组1中捕获该字符
  • []}]*
    :匹配0个或多个
    ]
    }
    字符
使用Java的演示:

import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Stream;

public class Main {
    public static void main(String[] args) {
        //Test
        
        Stream.of(
                "{[TestString]}", 
                "{TestString}", 
                "[TestString]", 
                "[TestString]}", 
                "{[TestString"
        ).forEach(s -> System.out.println(s + " => " + getToken(s)));       
    }
    static String getToken(String s) {
        Matcher matcher = Pattern.compile("[\\[{]*([^\\]\\[{}]+)[]}]*").matcher(s);
        String token="";
        if(matcher.find()) {
            token = matcher.group(1);
        }
        return token;
    }
}
{[TestString]} => TestString
{TestString} => TestString
[TestString] => TestString
[TestString]} => TestString
{[TestString => TestString
输出:

import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Stream;

public class Main {
    public static void main(String[] args) {
        //Test
        
        Stream.of(
                "{[TestString]}", 
                "{TestString}", 
                "[TestString]", 
                "[TestString]}", 
                "{[TestString"
        ).forEach(s -> System.out.println(s + " => " + getToken(s)));       
    }
    static String getToken(String s) {
        Matcher matcher = Pattern.compile("[\\[{]*([^\\]\\[{}]+)[]}]*").matcher(s);
        String token="";
        if(matcher.find()) {
            token = matcher.group(1);
        }
        return token;
    }
}
{[TestString]} => TestString
{TestString} => TestString
[TestString] => TestString
[TestString]} => TestString
{[TestString => TestString

类似于
^\{?\[(.*?\]?\}?$
,即

(?x) # enable comments  - just for this description
^    # start
\{?  # optional {
\[?  # optional [
(    # start group
.*?  # anything reluctant (try as less as possible)
)    # group end
\]?  # optional ]
\}?  # optional }
$    # end

请参见按绿色Java字段以查看其运行情况

可选字符的含义是什么?您是否可以使用
[TestString
TestString]
{[TestString]
{TestString]
等字符?“这里的特殊字符
{
[
]
}
是可选的。”您的模式似乎需要它们,您能确保您已经按照预期使用了术语“可选”吗?这些字符串是否嵌入到需要从中提取它们的较长字符串中?@JvdV是的,这些也是有效的输入。@Harish,请在您的OP中也提供这些类型的示例数据。当输入字符串为
{TestString]}
时(注意'['缺少),我得到“您的正则表达式与主题字符串不匹配。”这在你最初的问题中并不清楚。我已经更新了我的答案非常感谢!我得到了两个很好的答案,都很有效。我接受了你的解决方案,提到java对正则表达式和代码生成器实用程序的双斜杠要求——这是我以前不知道的。