【问题标题】:Regex to Split String which follows ABNF form正则表达式拆分字符串,遵循 ABNF 形式
【发布时间】:2020-08-05 07:19:50
【问题描述】:

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

字符串可能是这样的:

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

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

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

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

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

所以它返回以下结果:

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

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

【问题讨论】:

  • Regex 不是语法分析器。它不适合这项工作,尤其是不适用于split()。 --- “有些人在遇到问题时会想“我知道,我会使用正则表达式。”现在他们有两个问题。”
  • 你想建议一些其他的方法来分割这个吗?

标签: java arrays regex string


【解决方案1】:

解决方案

你可以使用这个正则表达式来实现你所需要的:

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

这是一个进行匹配的 sn-p:

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? 部分。

【讨论】:

  • 是;分隔符在 String 中是必需的吗?我只能使用这个:字符串查询=“query1(param1,param2,param3),query2,query3,query4(param1)”..如果我不使用;那么它没有列出query4(Param1)
  • @SitaramP 是必需的,因为我们想检查这个字符是否出现在捕获组之后。另一种选择是:"\\s?(.+?)(?:,|;$)(?![\\w,]+?\\))",注意"(?:,|;$)",它的意思是“, 字符或; 字符但它必须出现在字符串的末尾 "。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-19
  • 2011-06-18
  • 2011-10-16
  • 1970-01-01
相关资源
最近更新 更多