如何匹配重复的模式?
我想匹配:
some.name.separated.by.dots
但我不知道如何。
我可以匹配这样的单个部分
\w+\.
我怎么能说“重复一遍”
我想匹配:
some.name.separated.by.dots
但我不知道如何。
我可以匹配这样的单个部分
\w+\.
我怎么能说“重复一遍”
请尝试以下操作:
\w+(?:\.\w+)+
后告诉它与括号内的内容匹配一次或多次。+
(?: ... )
请注意,仅匹配 ASCII 字符,因此像这样的单词不会与 匹配,更不用说包含 Unicode 的单词/文本了。\w
café
\w+
和 之间的区别在于始终与单个字符匹配。它被称为“字符集”或“字符类”。因此,不匹配字符串 ,但匹配其中一个字符 ,或 。[...]
(?:...)
[...]
[abc]
"abc"
a
b
c
也匹配字符串的事实是因为 匹配 来自 的一个 或一个字符,然后由后面的字符重复零次或更多次。但是,因此也会匹配像 或 这样的字符串。\w+[\.\w+]*
[\.\w+]
.
\w
*
\w+[\.\w+]*
aaaaa
aaa...........
正如我已经提到的,它只是用于对字符进行分组(并可能重复这些组)。(?:...)
有关字符集的详细信息: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()
这也将工作:
(\w+(\.|$))+