这是我的正则表达式:
([+-]*)(\\d+)\\s*([a-zA-Z]+)
Run Code Online (Sandbox Code Playgroud)
问题是,我想匹配给定的输入,但它可以"链接".因此,当且仅当整个模式在这些事件之间没有任何重复时(空白除外),我的输入应该是有效的.(只有一个匹配或多个匹配彼此相邻,它们之间可能有空格).
有效的例子:
1day
+1day
-1 day
+1day-1month
+1day +1month
+1day +1month
Run Code Online (Sandbox Code Playgroud)
无效的例子:
###+1day+1month
+1day###+1month
+1day+1month###
###+1day+1month###
###+1day+1month###
Run Code Online (Sandbox Code Playgroud)
我的情况下,我可以使用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*)+$
Run Code Online (Sandbox Code Playgroud)
首先,通过添加开始和结束锚点(^和$),模式将不允许在匹配之前或之后的任何地方发生无效字符.
接下来,我在重复模式(\s*)之前和之后包含了可选的空格.
最后,将整个模式封装在转发器中,以便它可以连续多次出现((...)+).
另外,请注意,我还建议您更改[+-]*为[+-]?只能进行一次.
| 归档时间: |
|
| 查看次数: |
140 次 |
| 最近记录: |