java - 带分隔符的多个匹配项

标签 java regex

这是我的正则表达式:

([+-]*)(\\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*) 前后添加了可选的空格。

最后,整个模式包含在一个重复器中,以便它可以连续出现多次 ((...)+)。

另一方面,请注意,我还建议将 [+-]* 更改为 [+-]? 以便它只能出现一次。

Online Demo

关于java - 带分隔符的多个匹配项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34268391/

相关文章:

java - 为什么ArrayList返回错误: ArrayIndexOutOfBoundsException

java - testng 中的并行方法执行仅执行从类中调用的最后一个方法

java - 使用正则表达式查找字符串中的字符并替换

java - 如何获取存在于其根 Pojo 中的 List<Pojo1> ,它也作为 List<Pojo> 返回

java - 将变量分配给数组

regex - 将文本文件存储在结构化数组中

c++ - RE2 语法 : skip matching if don't share the same prefix

python - 查看正则表达式交替中的哪个组件被捕获

python - 在 python 正则表达式中查找特殊字符时匹配任何内容

java - Log4J2 和 Tomee Plus 7.0.47 不工作