簡體   English   中英

Java Regex - 拆分逗號分隔列表,但在括號內排除逗號

[英]Java Regex - split comma separated list, but exclude commas within parentheses

我正在嘗試編寫將像這樣拆分Java字符串的正則表達式:

300x250,468x60,300x400v(480x320,768x1024,100x100),400x300v,640x480v(200x200,728x90)

變成這樣的東西:

300x250 
468x60
300x400v(480x320,768x1024,100x100)
400x300v
640x480v(200x200,728x90)

我一直在嘗試\,(\()?但這最終也選擇了括號中的逗號。

如果您必須使用正則表達式,您可以拆分,(?![^(]*\\))

如果不是,那么對字符進行一次簡單的迭代就可以解決問題

String data="300x250,468x60,300x400v(480x320,768x1024,100x100),400x300v,640x480v(200x200,728x90)";

List<String> tokens=new ArrayList<>();
StringBuilder buffer=new StringBuilder();

int parenthesesCounter=0;

for (char c : data.toCharArray()){
    if (c=='(') parenthesesCounter++;
    if (c==')') parenthesesCounter--;
    if (c==',' && parenthesesCounter==0){
        //lets add token inside buffer to our tokens
        tokens.add(buffer.toString());
        //now we need to clear buffer  
        buffer.delete(0, buffer.length());
    }
    else 
        buffer.append(c);
}
//lets not forget about part after last comma
tokens.add(buffer.toString());

String[] splitedArray=tokens.toArray(new String[tokens.size()]);

//lets test what is inside our array
for (String s : splitedArray)
    System.out.println(s);

輸出

300x250
468x60
300x400v(480x320,768x1024,100x100)
400x300v
640x480v(200x200,728x90)

akburg,復活這個問題以完成,因為它有另一個沒有提到的簡單解決方案。 這種情況類似於匹配(或替換)模式,除了情況 s1、s2、s3 等

這是我們的簡單正則表達式:

\([^)]*\)|(,)

交替的左側匹配完整的(parentheses)標簽。 我們將忽略這些匹配。 右側將逗號匹配並捕獲到第 1 組,我們知道它們是正確的逗號,因為它們沒有被左側的表達式匹配。

這個程序展示了如何使用正則表達式(見在線演示底部的結果):

import java.util.*;
import java.io.*;
import java.util.regex.*;
import java.util.List;

class Program {
public static void main (String[] args) throws java.lang.Exception  {

String subject = "300x250,468x60,300x400v(480x320,768x1024,100x100),400x300v,640x480v(200x200,728x90)";
Pattern regex = Pattern.compile("\\([^)]*\\)|(,)");
Matcher m = regex.matcher(subject);
StringBuffer b= new StringBuffer();
while (m.find()) {
if(m.group(1) != null) m.appendReplacement(b, "SplitHere");
else m.appendReplacement(b, m.group(0));
}
m.appendTail(b);
String replaced = b.toString();
String[] splits = replaced.split("SplitHere");
for (String split : splits) System.out.println(split);
} // end main
} // end Program

參考

如何匹配(或替換)模式,除了情況 s1、s2、s3...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM