11

「,」(コンマ) の発生に基づいて分割する必要がある文字列がありますが、括弧のペア内にあるその発生を無視する必要があります。たとえば、B2B,(A2C,AMM),(BNC,1NF),(106,A01),AAA,AX3 次のように分割する必要があります

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

4 に答える 4

6

ネストされていない場合

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

FOR NESTED (括弧内の括弧)

(?<!\([^\)]*),(?![^\(]*\))
于 2012-10-06T04:26:22.473 に答える
2

特にデータの括弧内に括弧を含めることができる場合は、1 つの単純な反復がおそらく正規表現よりも優れたオプションになります。例えば:

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
于 2012-10-06T05:14:12.717 に答える
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);
}
于 2012-10-06T04:15:43.713 に答える
0

これを試して

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

説明: OR で区切られた 3 つの部分があります。(|)

  • \w{3}(?=,)- 任意の 3 文字の英数字 (アンダースコアを含む) に一致し、コンマの正の先読みを行います

  • (?<=,)\(\w{3},\w{3}\)(?=,)- このパターン(ABC,E4R)に一致し、コンマの正先読みと後読みも行います

  • (?<=,)\w{3}- 任意の 3 文字の英数字 (アンダースコアを含む) に一致し、コンマの後ろに正符号を付けます

于 2012-10-06T05:44:43.503 に答える