这是我的正则表达式:
([+-]*)(\\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*)+$
将部分实现这一目的,但如果我在下面的代码中使用它,它会返回与我正在寻找的结果不同的结果。
问题是我不能使用 (*my regex*)+
因为它会匹配整个东西。
解决方案可能是将整个输入与 ^\s*(([+-]*)(\d+)\s*([a-zA-Z]+)\s*)+ 匹配$
然后使用 ([+-]*)(\\d+)\\s*([a-zA-Z]+)
和 matcher.find()
和 matcher.group(i)
来提取每个匹配项及其组。但我一直在寻找更优雅的解决方案。
最佳答案
这应该适合你:
^\s*(([+-]*)(\d+)\s*([a-zA-Z]+)\s*)+$
首先,通过添加开始和结束 anchor (^
和 $
),该模式将不允许在匹配之前或之后的任何位置出现无效字符。
接下来,我在重复模式 (\s*
) 前后添加了可选的空格。
最后,整个模式包含在一个重复器中,以便它可以连续出现多次 ((...)+
)。
另一方面,请注意,我还建议将 [+-]*
更改为 [+-]?
以便它只能出现一次。
关于java - 带分隔符的多个匹配项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34268391/