Regex 对 java 中的多个字符串拆分不起作用吗?
Does not work Regex for multiple string split in java?
我想用多个字符串定界符拆分字符串。
例如:
字符串是 "abc[11]xyz[86]pqr[87]sdv[11]adf[86]fgr[87]fadggthy"
输出 :
美国广播公司
xyz
pqr
卫星电视
adf
fgr
时髦
我想按“[11]”、“[86]”、“[87]”拆分字符串
尝试了以下代码但不起作用。
void testSplit() {
StringBuilder message = new StringBuilder("abc[11]xyz[86]pqr[87]sdv[11]adf[86]fgr[87]fadggthy");
Map<String, String> replaceStringMap = new HashMap();
replaceStringMap.put("\\[11\\]", "11");
replaceStringMap.put("\\[86\\]", "86");
replaceStringMap.put("\\[87\\]", "87");
String starter = "(";
String middle = ")|(";
String end = ")";
Set<String> keySet = replaceStringMap.keySet();
boolean isFirst = true;
StringBuilder regex = new StringBuilder(starter);
Iterator<String> itr = keySet.iterator();
while(itr.hasNext()) {
String string = itr.next();
if(itr.hasNext()) {
regex.append(string);
regex.append(middle);
} else {
regex.append(string);
regex.append(end);
}
}
System.out.println(regex.toString());
String[] strings = message.toString().split(regex.toString());
for(String s : strings) {
System.out.println(s);
}
}
输出:
(\[87\])|(\[11\])|(\[86\])
abc[11]xyz[86]pqr[87]sdv[11]adf[86]fgr[87]fadggthy
Output:abc[11]xyz[86]pqr[87]sdv[11]adf[86]fgr[87]fadggthy
预期输出:
abc
xyz
pqr
卫星电视
adf
fgr
时髦
下面的代码有效:
String regex = "(\[87\])|(\[11\])|(\[86\])";
在这里,如果我对正则表达式进行硬编码,那么它就可以工作,但是当我通过从地图读取值来动态生成正则表达式时,它就不起作用了。
问题是我无法在动态级别生成正则表达式。
您的分隔符中多了一对 \
。
鉴于此:
StringBuilder message = new StringBuilder("abc[11]xyz[86]pqr[87]sdv[11]adf[86]fgr[87]fadggthy");
Map<String, String> replaceStringMap = new HashMap();
replaceStringMap.put("\[11\]", "11");
replaceStringMap.put("\[86\]", "86");
replaceStringMap.put("\[87\]", "87");
String starter = "(";
String middle = ")|(";
String end = ")";
Set<String> keySet = replaceStringMap.keySet();
boolean isFirst = true;
StringBuilder regex = new StringBuilder(starter);
Iterator<String> itr = keySet.iterator();
while (itr.hasNext()) {
String string = itr.next();
if (itr.hasNext()) {
regex.append(string);
regex.append(middle);
} else {
regex.append(string);
regex.append(end);
}
}
System.out.println(regex.toString());
String[] strings = message.toString().split(regex.toString());
for (String s : strings) {
System.out.println(s);
}
}
它产生这个:
(\[86\])|(\[87\])|(\[11\])
abc
xyz
pqr
sdv
adf
fgr
fadggthy
通用解决方案,对于 [] 之间的任何值都被视为分隔符:
String test = abc[11]xyz[86]pqr[87]sdv[11]adf[86]fgr[87]fadggthy
String r = "(\[[^\]]*\])"
for(String part : test.split(r)) println(part)
> abc
> xyz
> pqr
> sdv
> adf
> fgr
> fadggthy
我想用多个字符串定界符拆分字符串。 例如:
字符串是 "abc[11]xyz[86]pqr[87]sdv[11]adf[86]fgr[87]fadggthy" 输出 : 美国广播公司 xyz pqr 卫星电视 adf fgr 时髦
我想按“[11]”、“[86]”、“[87]”拆分字符串 尝试了以下代码但不起作用。
void testSplit() {
StringBuilder message = new StringBuilder("abc[11]xyz[86]pqr[87]sdv[11]adf[86]fgr[87]fadggthy");
Map<String, String> replaceStringMap = new HashMap();
replaceStringMap.put("\\[11\\]", "11");
replaceStringMap.put("\\[86\\]", "86");
replaceStringMap.put("\\[87\\]", "87");
String starter = "(";
String middle = ")|(";
String end = ")";
Set<String> keySet = replaceStringMap.keySet();
boolean isFirst = true;
StringBuilder regex = new StringBuilder(starter);
Iterator<String> itr = keySet.iterator();
while(itr.hasNext()) {
String string = itr.next();
if(itr.hasNext()) {
regex.append(string);
regex.append(middle);
} else {
regex.append(string);
regex.append(end);
}
}
System.out.println(regex.toString());
String[] strings = message.toString().split(regex.toString());
for(String s : strings) {
System.out.println(s);
}
}
输出:
(\[87\])|(\[11\])|(\[86\])
abc[11]xyz[86]pqr[87]sdv[11]adf[86]fgr[87]fadggthy
Output:abc[11]xyz[86]pqr[87]sdv[11]adf[86]fgr[87]fadggthy
预期输出:
abc xyz pqr 卫星电视 adf fgr 时髦
下面的代码有效:
String regex = "(\[87\])|(\[11\])|(\[86\])";
在这里,如果我对正则表达式进行硬编码,那么它就可以工作,但是当我通过从地图读取值来动态生成正则表达式时,它就不起作用了。 问题是我无法在动态级别生成正则表达式。
您的分隔符中多了一对 \
。
鉴于此:
StringBuilder message = new StringBuilder("abc[11]xyz[86]pqr[87]sdv[11]adf[86]fgr[87]fadggthy");
Map<String, String> replaceStringMap = new HashMap();
replaceStringMap.put("\[11\]", "11");
replaceStringMap.put("\[86\]", "86");
replaceStringMap.put("\[87\]", "87");
String starter = "(";
String middle = ")|(";
String end = ")";
Set<String> keySet = replaceStringMap.keySet();
boolean isFirst = true;
StringBuilder regex = new StringBuilder(starter);
Iterator<String> itr = keySet.iterator();
while (itr.hasNext()) {
String string = itr.next();
if (itr.hasNext()) {
regex.append(string);
regex.append(middle);
} else {
regex.append(string);
regex.append(end);
}
}
System.out.println(regex.toString());
String[] strings = message.toString().split(regex.toString());
for (String s : strings) {
System.out.println(s);
}
}
它产生这个:
(\[86\])|(\[87\])|(\[11\])
abc
xyz
pqr
sdv
adf
fgr
fadggthy
通用解决方案,对于 [] 之间的任何值都被视为分隔符:
String test = abc[11]xyz[86]pqr[87]sdv[11]adf[86]fgr[87]fadggthy
String r = "(\[[^\]]*\])"
for(String part : test.split(r)) println(part)
> abc
> xyz
> pqr
> sdv
> adf
> fgr
> fadggthy