解析类似 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)
}
我正在开发一个小 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)
}