我有一个字符串需要根据逗号“,”进行拆分,但需要忽略出现在圆括号中的任何逗号。
例如:B2B,(A2C,AMM),(BNC,1NF),(106,A01),AAA,AX3
应该被拆分成
B2B,
(A2C,AMM),
(BNC,1NF),
(106,A01),
AAA,
AX3
我有一个字符串需要根据逗号“,”进行拆分,但需要忽略出现在圆括号中的任何逗号。
例如:B2B,(A2C,AMM),(BNC,1NF),(106,A01),AAA,AX3
应该被拆分成
B2B,
(A2C,AMM),
(BNC,1NF),
(106,A01),
AAA,
AX3
对于非嵌套情况
,(?![^\(]*\))
嵌套(括号内包含括号)
(?<!\([^\)]*),(?![^\(]*\))
请尝试以下操作:
var str = 'B2B,(A2C,AMM),(BNC,1NF),(106,A01),AAA,AX3';
console.log(str.match(/\([^)]*\)|[A-Z\d]+/g));
// gives you ["B2B", "(A2C,AMM)", "(BNC,1NF)", "(106,A01)", "AAA", "AX3"]
Java版:
String str = "B2B,(A2C,AMM),(BNC,1NF),(106,A01),AAA,AX3";
Pattern p = Pattern.compile("\\([^)]*\\)|[A-Z\\d]+");
Matcher m = p.matcher(str);
List<String> matches = new ArrayList<String>();
while(m.find()){
matches.add(m.group());
}
for (String val : matches) {
System.out.println(val);
}
'\([^)]*\)|[^,()]+'
是另一种选择,它允许除大写字母和数字之外的更多字符。 - user650654一个简单的迭代可能比任何正则表达式更好,特别是如果你的数据可以在括号内包含括号。例如:
String data="Some,(data,(that),needs),to (be, splited) by, comma";
StringBuilder buffer=new StringBuilder();
int parenthesesCounter=0;
for (char c:data.toCharArray()){
if (c=='(') parenthesesCounter++;
if (c==')') parenthesesCounter--;
if (c==',' && parenthesesCounter==0){
//lets do something with this token inside buffer
System.out.println(buffer);
//now we need to clear buffer
buffer.delete(0, buffer.length());
}
else
buffer.append(c);
}
//lets not forget about part after last comma
System.out.println(buffer);
输出
Some
(data,(that),needs)
to (be, splited) by
comma
试试这个
\w{3}(?=,)|(?<=,)\(\w{3},\w{3}\)(?=,)|(?<=,)\w{3}
解释:由 OR (|)
分隔的三个部分:
\w{3}(?=,)
- 匹配 3 个任意字母数字字符(包括下划线),并进行逗号的正向先行断言
(?<=,)\(\w{3},\w{3}\)(?=,)
- 匹配此模式 (ABC,E4R)
,并进行逗号的正向先行和后行断言
(?<=,)\w{3}
- 匹配 3 个任意字母数字字符(包括下划线),并进行逗号的正向后行断言