使用平衡括号在Java中拆分字符串

3

我需要把以下字符串分割成:

((OPERATING_CARRIER='AB' OR OPERATING_CARRIER='AB' OR (OPERATING_CARRIER='VA' AND (FLIGHT_NO=604 OR FLIGHT_NO=603))))
OPERATING_CARRIER='AB'
OPERATING_CARRIER='AB'
OPERATING_CARRIER='VA'
FLIGHT_NO=604
FLIGHT_NO=603

我尝试了以下代码:
String syntax = "(OPERATING_CARRIER='AB' OR OPERATING_CARRIER='AB' OR     (OPERATING_CARRIER='VA' AND (FLIGHT_NO=604 OR FLIGHT_NO=603)))";
List < String > matchList = new ArrayList < String > ();
Pattern regex = Pattern.compile("\\(([^)]*)\\)");
Matcher regexMatcher = regex.matcher(syntax);
while (regexMatcher.find()) 
{
    matchList.add(regexMatcher.group(1));
    System.out.println(regexMatcher.group(1));
}

我得到了一个输出:OPERATING_CARRIER='AB' 或 OPERATING_CARRIER='AB' 或 (OPERATING_CARRIER='VA' 且 (FLIGHT_NO=604 或 FLIGHT_NO=603


还可以提出其他的方法来完成这个任务。 - jason
也许你可以摆脱所有括号,然后按照“或”和“与”进行拆分。 - Averroes
3个回答

5

试试这个:

String s="((OPERATING_CARRIER='AB' OR OPERATING_CARRIER='AB' OR (OPERATING_CARRIER='VA' AND (FLIGHT_NO=604 OR FLIGHT_NO=603))))";

Matcher m = Pattern.compile("\\w+\\s*=\\s*(?:'[^']+'|\\d+)").matcher(s);

while(m.find()) {
    String aMatch = m.group();
    // add aMatch to match list...
    System.out.println(aMatch);
}

输出

OPERATING_CARRIER='AB'
OPERATING_CARRIER='AB'
OPERATING_CARRIER='VA'
FLIGHT_NO=604
FLIGHT_NO=603

正则表达式

正则表达式可视化


不错的可视化。有没有相关的工具或网站? - Andreas
1
@Stephan 我发的是我使用的代码:大家好,我已经使用了以下代码来拆分字符串:`String input= "name = 'name_1' AND in_stock IN {'in_stock_1','in_stock_2'} AND ( price BETWEEN '01-jan-2015' and '31-may-2015' OR price = 'price_3' )"; String sa =input; String[] arr = sa.replaceAll("[()]+","").split("\\s*(\\sOR|\\sAND)\\s*"); for(int i=0;i感谢大家的建议和帮助。 - jason

3

这里有一种方法(也许不是最有效的):

  1. 删除括号
  2. OR 分割
  3. AND 分割

以下是一个实现示例:

    ArrayList<String> results = new ArrayList<>();
    String input = "((OPERATING_CARRIER='AB' OR OPERATING_CARRIER='AB' OR (OPERATING_CARRIER='VA' AND (FLIGHT_NO=604 OR FLIGHT_NO=603))))";
    String withoutBrakets = input.replaceAll("\\(", "").replaceAll("\\)","");
    String[] withoutOr = withoutBrakets.split("OR");
    for(String sOr : withoutOr) {
        String[] withoutAnd = sOr.split("AND");
        for(String sAnd : withoutAnd) {
            results.add(sAnd);
        }
    }

输出

[OPERATING_CARRIER='AB' ,  OPERATING_CARRIER='AB' ,  OPERATING_CARRIER='VA' ,  FLIGHT_NO=604 ,  FLIGHT_NO=603]

编辑,@Stephan的正则表达式答案看起来肯定更好


1

大家好,我使用了以下代码来分割字符串:

String input = "name = 'name_1' AND in_stock IN {'in_stock_1','in_stock_2'} AND ( price BETWEEN '01-jan-2015' and '31-may-2015' OR price = 'price_3' )"; 
String sa =input;
String[] arr = sa.replaceAll("[()]+","").split("\\s*(\\sOR|\\sAND)\\s*");

for(int i=0;i<arr.length;i++) {
   System.out.println(arr[i]);
} 

感谢您提供的所有输入和帮助。

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