java - 正则表达式分割遵循 ABNF 形式的字符串

标签 java arrays regex string

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

字符串可能是这样的:

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

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

我们需要一个正则表达式来分割此表单,使其返回:

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

目前我已经使用了这个正则表达式 "\\)," 就像: query.split ("\\),");

所以它返回以下结果:

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

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

最佳答案

解决方案

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

\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)]

说明

我们使用括号创建一个捕获组,并告诉它在看到 ,; 字符时结束,但前提是没有 )紧随其后的 (这就是负向前瞻的用途 - (?!\w+?\)))

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

关于java - 正则表达式分割遵循 ABNF 形式的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61362271/

相关文章:

java - Eclipse 和设置全局 jvm 系统属性,即 -Dxxx=yyy

c# - 在 C# 中查找子数组的第一次出现/起始索引

c# - 检查两个字符串数组中是否有相同的元素?

java - 从字符串格式的十进制/Java 错误中删除尾随 0 - 后向模式匹配必须在索引 15 附近具有有限的最大长度

javascript - 仅当不是 html 时才转换为 anchor

java - 我如何使用星号执行 getRuntime().exec?

java - 当应用程序第一次启动时,图片开始闪烁。重启后,该问题解决。为什么?

javascript - 在 jquery 中创建一个关联数组

python - 匹配 Domain.CCTLD 的正则表达式

java - 如何在Libgdx中进行追踪?