基于正则表达式拆分字符串

11

我有一个字符串需要根据逗号“,”进行拆分,但需要忽略出现在圆括号中的任何逗号。 例如:B2B,(A2C,AMM),(BNC,1NF),(106,A01),AAA,AX3 应该被拆分成

B2B,
(A2C,AMM),
(BNC,1NF),
(106,A01),
AAA,
AX3

1
你需要在“B2B”后面加逗号“,”吗? - xdazz
不,那只是为了演示应该如何分割。 - user1724501
也许你可以检查一下CSV解析器。它们正是这样做的,只不过处理的是引号而不是括号。 - Christophe
str.split("\([^)]*\)|[^,()]+"); 返回所有的“,”。 - user1724501
1
那么,对于字符串"B2B,((A2C,AMM),CCC),(ABC,CBA),AAA",你需要处理类似这样的内容(即平衡的括号)吗?如果是这样,忘记正则表达式吧,这是不可能的(我是真的指不可能,而不仅仅是极其困难)。 - Bruno Reis
4个回答

6

对于非嵌套情况

,(?![^\(]*\))

嵌套(括号内包含括号)

(?<!\([^\)]*),(?![^\(]*\))

2

请尝试以下操作:

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
@user650654 是的,没错。 - xdazz
@Evgeni,应该是console而不是Console。 - xdazz
注意,在Java中使用String.split(...)将无法得到期望的结果。 - LanguagesNamedAfterCofee

2

一个简单的迭代可能比任何正则表达式更好,特别是如果你的数据可以在括号内包含括号。例如:

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

0

试试这个

\w{3}(?=,)|(?<=,)\(\w{3},\w{3}\)(?=,)|(?<=,)\w{3}

解释:由 OR (|) 分隔的三个部分:

  • \w{3}(?=,) - 匹配 3 个任意字母数字字符(包括下划线),并进行逗号的正向先行断言

  • (?<=,)\(\w{3},\w{3}\)(?=,) - 匹配此模式 (ABC,E4R),并进行逗号的正向先行和后行断言

  • (?<=,)\w{3} - 匹配 3 个任意字母数字字符(包括下划线),并进行逗号的正向后行断言


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接