如何匹配重复模式?
我想匹配:
some.name.separated.by.dots
但我不知道怎么做。
我可以匹配这样的单个部分
\w+\.
怎么说“重复那个”
请尝试以下方法:
\w+(\.\w+)+
+
after ( ... )
告诉它匹配括号内的内容一次或多次。
请注意\w
仅匹配ASCII字符,因此像café
这样的单词不会与\w+
匹配,更不用说包含Unicode的单词/文本了。
编辑
[...]
和(...)
之间的区别在于[...]
[...]
始终匹配单个字符。 它被称为“字符集”或“字符类”。 因此, [abc]
与字符串"abc"
不匹配,但匹配字符a
, b
或c
。
\w+[\.\w+]*
也匹配你的字符串是因为[\.\w+]
匹配a .
或来自\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+(\.|$))+
你可以用?
匹配前面部分的0或1, *
匹配前面部分的任何数量的0, +
匹配前面部分中的至少一个。
那么(\w\.)?
会匹配w。 并且一个空格, (\w\.)*
将匹配r.2.5.3.1.srgs和一个空格,而(\w\.)+
将匹配以上任何一个但不是空格。
如果你想匹配你的例子之类的东西,你需要做(\w+\.)+
,这意味着’匹配至少一个非空白,然后是一个句点,并且至少匹配其中一个’。
(\w+\.)+
显然,身体必须至少30个字符。 我希望这已经足够了。