如何匹配重复的模式?

2022-09-01 06:54:23

我想匹配:

some.name.separated.by.dots

但我不知道如何。

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

 \w+\.

我怎么能说“重复一遍”


答案 1

请尝试以下操作:

\w+(?:\.\w+)+

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

请注意,仅匹配 ASCII 字符,因此像这样的单词不会与 匹配,更不用说包含 Unicode 的单词/文本了。\wcafé\w+

编辑

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

也匹配字符串的事实是因为 匹配 来自 的一个 或一个字符,然后由后面的字符重复零次或更多次。但是,因此也会匹配像 或 这样的字符串。\w+[\.\w+]*[\.\w+].\w*\w+[\.\w+]*aaaaaaaa...........

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

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

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

编辑二

这里有一个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()


答案 2

这也将工作:

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