如何匹配重复模式?

时间:2011-01-19 19:33:41

标签: java regex

我想要匹配:

some.name.separated.by.dots

但我不知道怎么做。

我可以匹配像这样的单个部分

 \w+\.

我怎么说“重复那个”

4 个答案:

答案 0 :(得分:22)

尝试以下方法:

\w+(\.\w+)+

+( ... )告诉它与括号内的内容匹配一次或多次。

请注意,\w仅匹配ASCII字符,因此café之类的字词不会与\w+匹配,更不用说包含Unicode的字词/文字了。

修改

[...](...)之间的区别在于[...]始终与单个字符匹配。它被称为“字符集”或“字符类”。因此,[abc] 匹配字符串"abc",但匹配其中一个字符abc。< / p>

\w+[\.\w+]*也匹配您的字符串的事实是因为[\.\w+]匹配.或来自\w的字符,然后由*重复零次或多次{1}}之后。但是,\w+[\.\w+]*也会匹配aaaaaaaa...........等字符串。

正如我已经提到的,(...)仅用于对字符进行分组(并且可能重复这些组)。

有关字符集的更多信息:http://www.regular-expressions.info/charclass.html

有关群组的更多信息:http://www.regular-expressions.info/brackets.html

编辑II

以下是Java中的一个示例(看到您主要发布Java答案):

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Main {
    public static void main(String[] args) {
        String text = "some.text.here only but not Some other " + 
                "there some.name.separated.by.dots and.we are done!";
        Pattern p = Pattern.compile("\\w+(\\.\\w+)+");
        Matcher m = p.matcher(text);
        while(m.find()) {
            System.out.println(m.group());
        }
    }
}

将产生:

some.text.here
some.name.separated.by.dots
and.we

请注意,m.group(0)m.group()是等效的:表示“整场比赛”。

答案 1 :(得分:2)

这也有效:

(\w+(\.|$))+

答案 2 :(得分:-1)

您可以使用?匹配前面部分中的0或1,*以匹配前面部分的任意数量的0和+以匹配至少一个部分前面的部分。

所以(\w\.)?将匹配w。并且空白,(\w\.)*将匹配r.2.5.3.1.s.r.g.s.并且空白,(\w\.)+将匹配以上任何内容,但不是空白。

如果你想匹配你的例子之类的东西,你需要做(\w+\.)+,这意味着'匹配至少一个非空白,然后是一个句点,并且至少匹配其中一个'。

答案 3 :(得分:-2)

(\w+\.)+

显然,身体必须至少30个字符。我希望这已经足够了。