【发布时间】:2015-12-15 00:20:47
【问题描述】:
这是我的正则表达式:
([+-]*)(\\d+)\\s*([a-zA-Z]+)
- 第 1 组 = 标志
- 第 2 组 = 乘数
- 第 3 组 = 时间单位
问题是,我想匹配给定的输入,但它可以被“链接”。因此,当且仅当整个模式重复且在这些事件之间没有任何内容(空格除外)时,我的输入才应该有效。 (只有一个匹配或多个匹配彼此相邻,它们之间可能有空格)。
有效示例:
1day
+1day
-1 day
+1day-1month
+1day +1month
+1day +1month
无效示例:
###+1day+1month
+1day###+1month
+1day+1month###
###+1day+1month###
###+1day+1month###
在我的情况下,我可以使用 matcher.find() 方法,这可以解决问题,但它会接受这样的输入:+1day###+1month 这对我无效。
有什么想法吗?这可以通过多个 IF 条件和对开始和结束索引的多次检查来解决,但我正在寻找优雅的解决方案。
编辑
^\s*(([+-]*)(\d+)\s*([a-zA-Z]+)\s*)+$ 下面的 cmets 中建议的正则表达式将部分起到作用,但如果我在下面的代码中使用它,它返回的结果与我正在寻找的结果不同。
问题是我不能使用(*my regex*)+,因为它会匹配整个事情。
解决方案可能是将整个输入与^\s*(([+-]*)(\d+)\s*([a-zA-Z]+)\s*)+$ 匹配,然后使用([+-]*)(\\d+)\\s*([a-zA-Z]+) 与matcher.find() 和matcher.group(i) 提取每个匹配项及其组。但我一直在寻找更优雅的解决方案。
【问题讨论】: