如何通过空格找到多个(并且只能)相互分开的匹配?
我有这个正则表达式:
/([0-9]+)\s*([A-Za-z]+)/
我希望每个匹配(不是组)都被空格或其他匹配包围。 如果条件未满足,则不应返回匹配。
这是有效的:1min 2hours 3days
不是:1min, 2hours 3days
(不应返回1min
和2hours
)
是否有一种更简单的方法来查找连续的匹配序列(最好是Java),而不是在主序列之前和之后重复整个正则表达式,检查是否有空格,字符串的开始/结束或其他匹配? / p>
答案 0 :(得分:1)
String text = "1min 2hours 3days";
boolean match = text.matches("(?:\\s*[0-9]+\\s*[A-Za-z]+\\s*)*");
这基本上是在你的例子中寻找一个模式。然后在模式之后使用*
查找text
中模式的零次或多次出现。并且?:
表示不捕获该组。
对于空字符串,这也将返回true。如果您不希望空字符串为true,请将*
更改为+
答案 1 :(得分:1)
我相信这种模式符合您的要求(前提是只有一个空格字符可以分隔您的字母数字标记):
(?<=^|[\w\d]\s)([\w\d]+)(?=\s|$)
^^^^^^^^^^ ^^^^^^^ ^^^^
(2) (1) (3)
以下是我在演示中包含的一些示例数据。每个粗体字母数字字符串表示成功捕获:
1分2小时3天
1分钟,2小时 3天
42分钟4小时2天
答案 2 :(得分:0)
我设法通过使用string.split("\\s+")
拆分字符串然后将结果与模式/([0-9]+)\s*([A-Za-z]+)/
匹配来解决我的问题。
答案 3 :(得分:0)
此处有一个错误,''会匹配所有字符并忽略您的休息 /([0-9] +)\ S ([A-ZA-Z] +)/
更改为
/(\d+)\s+(\w+)/g
这将返回数字或字符匹配的数组。没有必要总是写'[0-9]'或'[A-Za-z]'相同的东西可以说是'\ d'匹配任何0到9更多可以在这个备忘单{{{ 3}}