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

时间:2015-01-01 19:46:07

标签: java regex parsing

我正在处理一个小型的Android应用程序,只要我暂停或我必须重新开始运行就会发出哔哔声。 它非常基本:我只使用正则表达式创建了一个输入验证器,现在我试图解析该输入。

输入就像一个csv,但我希望有重复的组。

例如:2.5,1,5(6,3),1,2.5意味着2.5分钟的热身,1分钟的步行,然后是5分钟的6分钟的跑步和3分钟的步行......(你希望得到其余部分)

主要问题是在逗号上拆分字符串意味着重复组也会被拆分。我可以在这些组中使用另一个分隔符,但这看起来并不像我一样:)

你有什么想法吗?

谢谢,

Antarion

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

2 个答案:

答案 0 :(得分:0)

您的问题是:

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

您需要的正则表达式是:

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

它的作用:

, - >用逗号分割字符串

(?= - >开始'前瞻'。这意味着:仅当跟随字符时才进行拆分:

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

* - >重复0次或更多次

(?: - >没有捕捉前瞻

\( - >右括号

| - >或

$ - >字符串结尾

答案 1 :(得分:0)

正则表达式并不是处理需要状态的解析的正确工具。你最好只是必须解析它。这样的事情,也许是:

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) 
}