一个接一个地找到一个匹配

时间:2014-03-01 19:42:05

标签: regex

如何通过空格找到多个(并且只能)相互分开的匹配?

我有这个正则表达式:

/([0-9]+)\s*([A-Za-z]+)/

我希望每个匹配(不是组)都被空格或其他匹配包围。 如果条件未满足,则不应返回匹配。

这是有效的:1min 2hours 3days

不是:1min, 2hours 3days(不应返回1min2hours

是否有一种更简单的方法来查找连续的匹配序列(最好是Java),而不是在主序列之前和之后重复整个正则表达式,检查是否有空格,字符串的开始/结束或其他匹配? / p>

4 个答案:

答案 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. 后面的断言:对于捕获组的 必须 a)开头该行或 b)一个字母数字字符,后跟一个空格字符。
  3. 前瞻性断言:对于捕获组的 右侧 ,必须 a)一个空格字符或 b)该行的结尾。
  4. 请参阅regex101.com demo


    以下是我在演示中包含的一些示例数据。每个粗体字母数字字符串表示成功捕获:

    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}}