这是我的正则表达式:
([+-]*)(\\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*)+$
首先,通过添加开始和结束锚点(^
和$
),模式将不允许在匹配之前或之后的任何地方发生无效字符.
接下来,我在重复模式(\s*
)之前和之后包含了可选的空格.
最后,将整个模式封装在转发器中,以便它可以连续多次出现((...)+
).
另外,请注意,我还建议您更改[+-]*
为[+-]?
只能进行一次.
在线演示