我正在尝试在Bananas|,|Bananas|||Bananas|Oranges|,|Bananas|||Bananas|Oranges|||Bananas|Oranges|Green Apples|,|Bananas|||Bananas|Oranges|||Bananas|Oranges|Red Apples|,|Bananas|||Bananas|Oranges|||Bananas|Oranges|Pears
或|||
分隔符上将带有正则表达式的|,|
格式的字符串拆分。我正在使用[a-zA-Z |]+\|[,|\0]\|
,但我遇到一个小问题:[a-zA-Z |]
字符类捕获了三管分隔符。
有没有办法将[a-zA-Z |]
字符类更改为只接受一行中的一个管道字符,同时允许任意数量的其他管道字符? (即,它应该接受accessories|batteries
但不接受accessories||batteries
。)
更多示例:在原始字符串中,正则表达式应接受Bananas|Oranges|,|
或Bananas|||
,而不是Bananas|||Bananas|Oranges|,|
,在{{1}之前使用任意数量的单管道分隔名称}。
答案 0 :(得分:1)
我认为您希望包含大量这些[a-zA-Z ]+
的群组后跟\|
。该群组可以重复多次,并始终由,|
或||
终止(在追踪|
之后)(,|\|)\|
总而言之:([a-zA-Z ]+\|)+(,|\|)\|
答案 1 :(得分:0)
由于您说您正在使用Java,因此另一种方法是计算:
s.replaceAll("|||", "|,|").split("|,|");
其中s是你的起始字符串。
答案 2 :(得分:0)
为什么不在正则表达式上使用非贪婪的量词?这样它就会停在它找到的第一个|||
或|,|
。
答案 3 :(得分:0)
我错过了什么,但为什么你不能使用正则表达式进行直接拆分== \|\|\||\|,\|
?这是一个适合我的测试脚本:
import java.util.regex.*;
public class TEST {
public static void main(String[] args) {
String subjectString = "Bananas|,|Bananas|||Bananas|Ora" +
"nges|,|Bananas|||Bananas|Oranges|||Bananas|Oranges|Gre" +
"en Apples|,|Bananas|||Bananas|Oranges|||Bananas|Orange" +
"s|Red Apples|,|Bananas|||Bananas|Oranges|||Bananas|Ora" +
"nges|Pears";
String[] splitArray = null;
Pattern regex = Pattern.compile("\\|\\|\\||\\|,\\|");
splitArray = regex.split(subjectString);
int i;
for (i = 0; i < splitArray.length; ++i) {
System.out.println(splitArray[i]);
}
}
}
这是输出:
Bananas
Bananas
Bananas|Oranges
Bananas
Bananas|Oranges
Bananas|Oranges|Green Apples
Bananas
Bananas|Oranges
Bananas|Oranges|Red Apples
Bananas
Bananas|Oranges
Bananas|Oranges|Pears