当前位置:  开发笔记 > 编程语言 > 正文

多个匹配分隔符

如何解决《多个匹配分隔符》经验,为你挑选了1个好方法。

这是我的正则表达式:

([+-]*)(\\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)提取每场比赛和他的团体.但我一直在寻找更优雅的解决方案.



1> Steven Dogga..:

这应该适合你:

^\s*(([+-]*)(\d+)\s*([a-zA-Z]+)\s*)+$

首先,通过添加开始和结束锚点(^$),模式将不允许在匹配之前或之后的任何地方发生无效字符.

接下来,我在重复模式(\s*)之前和之后包含了可选的空格.

最后,将整个模式封装在转发器中,以便它可以连续多次出现((...)+).

另外,请注意,我还建议您更改[+-]*[+-]?只能进行一次.

在线演示

推荐阅读
郑谊099_448
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有