有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java正则表达式,用于拆分遵循ABNF格式的字符串

我确实有一个遵循特定语法的字符串

字符串可以如下所示:

String query = query1 (param1,param2), query2, query3, query4 (param1);

没有可用的常用词。所有查询/参数可以是任何可能包含字符和数字的字符串

我们需要一个正则表达式来拆分此表单,它应该返回:

query1 (param1,param2)
query2
query3
query4 (param1)

目前我使用了这个regex "\\),"类似:query.split ("\\),");

因此,它返回以下结果:

query1 (param1,param2
query2, query3, query4 (param1

我需要更正这个正则表达式吗?使用正则表达式拆分这种形式的字符串是否可行


共 (1) 个答案

  1. # 1 楼答案

    解决方案

    您可以使用此正则表达式来实现所需的功能:

    \s?(.+?)[,;](?![\w,]+?\))
    

    下面是一个进行匹配的代码片段:

    String query = "query1 (param1,param2,param3), query2, query3, query4 (param1);";
    String pattern = "\\s?(.+?)[,;](?![\\w,]+?\\))";
    List<String> list = new ArrayList<String>();
    
    Pattern r = Pattern.compile(pattern);
    Matcher m = r.matcher(query);
    
    while (m.find()) {
      list.add(m.group(1));
    }
    
    System.out.println(list); // [query1 (param1,param2,param3),  query2,  query3,  query4 (param1)]
    

    解释

    我们使用paranthesis创建一个捕获组,当它看到一个,或一个;字符时,告诉它结束,但前提是它后面没有)(这就是负前瞻的意义所在-(?!\w+?\))

    我们还希望删除前导空格,因此在捕获组之外添加了\s?部分