如何在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对正则表达式和代码生成器实用程序的双斜杠要求——这是我以前不知道的。