解析类似 csv 的输入(有点怪癖)

Parsing csv-like input (with a little quirk)

我正在开发一个小 Android 应用程序,每当我暂停或必须重新开始 运行 时都会发出哔哔声。 它非常基础:我只使用正则表达式创建了一个输入验证器,现在我正在尝试解析该输入。

输入类似于 csv,但我想要重复分组。

例如:2.5,1,5(6,3),1,2.5 表示 2.5 分钟的热身,1 分钟的步行,然后五次 6 分钟的 运行 和 3 分钟的步行......(我希望你得到休息)

主要问题是用逗号拆分字符串意味着重复组也会被拆分。我可能会在这些组中使用另一个定界符,但对我来说这似乎不太整洁:)

你有什么想法吗?

谢谢,

安塔里昂

(顺便说一句:这是我的正则表达式 https://regex101.com/r/kJ3rP8/1

您的问题是:

除非在方括号内,否则如何用逗号分隔字符串。

您需要的正则表达式是:

,(?=[^\)]*(?:\(|$))

它的作用:

, -> 用逗号分割字符串

(?= -> 'lookahead' 的开头。这意味着:仅当 后面的 个字符如下时才拆分:

[^\)] -> 不关闭括号

* -> 重复 0 次或多次

(?: -> 未捕获先行

\( -> 右括号

| -> 或

$ -> 字符串结尾

Regex 并不是处理需要状态的解析的正确工具。你最好只是命令式地解析它。可能是这样的:

Pattern p = Pattern.compile("(.+?)([,()])");
Matcher m = p.matcher(input);
while(m.find) {
   String number = m.group(1);
   String delim  = m.group(2);
   if(delim.equals("(")) startRepeatingGroup(number);
   else if(delim.equals(")")  endRepeatingGroup(number);
   else processNextNumber(number) 
}