Java 如何匹配重复模式?

Java 如何匹配重复模式?,java,regex,Java,Regex,我想匹配: some.name.separated.by.dots 但我不知道怎么做 我可以匹配像这样的单个部件 \w+\. 我怎么能说“重复那个”试试下面的方法: \w+(\.\w+)+ (…)后面的+告诉它匹配括号内的内容一次或多次 请注意,\w只匹配ASCII字符,因此像café这样的单词不会被\w+匹配,更不用说包含Unicode的单词/文本了 编辑 […]和(…)之间的区别在于[…]始终匹配单个字符。它被称为“字符集”或“字符类”。因此,[abc]不匹配字符串“abc”,而是匹

我想匹配:

some.name.separated.by.dots
但我不知道怎么做

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

 \w+\.
我怎么能说“重复那个”

试试下面的方法:

\w+(\.\w+)+
(…)
后面的
+
告诉它匹配括号内的内容一次或多次

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

编辑
[…]
(…)
之间的区别在于
[…]
始终匹配单个字符。它被称为“字符集”或“字符类”。因此,
[abc]
不匹配字符串
“abc”
,而是匹配字符
a
b
c
中的一个

\w+[\.\w+]*
也与您的字符串匹配,这是因为
[\.\w+]
\w
中的字符匹配,之后的
*
会重复零次或多次。但是,
\w+[\.\w+]*
因此也将匹配字符串,如
aaaaaaa
aaa………..

正如我已经提到的,
(…)
只是用来对字符进行分组(并可能重复这些分组)

有关字符集的详细信息:

有关组的更多信息:

编辑二 下面是一个Java示例(看到您发布的主要是Java答案):

这将产生:

some.text.here
some.name.separated.by.dots
and.we
注意
m.group(0)
m.group()
是等价的:意思是“整个匹配”


显然,尸体必须至少有30个字符。我希望这就足够了。

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

所以
(\w\)?
将匹配w。空白,
(\w\)*
将与r.2.5.3.1.s.r.g.s匹配。和空白,
(\w\)+
将匹配上述任何一项,但不是空白

如果要匹配与示例类似的内容,则需要执行
(\w+\)++
,这意味着“匹配至少一个非空白,然后是句点,并至少匹配其中一个”。

这也可以:

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

这将需要一个尾随句点,与他的示例相反。根据您的回答,我得出了以下结论:
\w+[\.\w+]*
(我想稍后需要这些括号)。你能解释一下为什么
()
[]
有效吗?@Oscar:Bart的回答解决了这个问题。@SilentGost是的,我刚刚注意到:P(复制/粘贴错误)我的意思是说我用
[]
而不是
()
,但我真的不明白其中的区别。我只知道前者不会创造一个group@Bart:当然,在某些正则表达式语言中,
\w+
与Unicode完全匹配。表示
\w
应该表示的意思的Java正则表达式是
[\pL\pM\p{Nd}\p{Nl}\p{Pc}[\p{InEnclosedAlphanumerics}&\p{So}]
@tchrist,
\w
[\pL\pM\p{Nd}\p{Nl Nd}\p{Nl p}\p{InEnclosedAlphanumerics}&\p},区别是什么当然,某些实现确实有适当的Unicode支持。谁否决了我?如果我在某个地方出了问题,我不介意学习更多关于正则表达式的知识,因为我对它们还很陌生。是因为它将匹配
foo.foo.
而不是
foo.foo
?我没有投你反对票(也没有投你反对票),但从其他人的反对票来看,我会说是的,这就是原因。实际上,没有一个regexp与我的字符串匹配:(您可能需要避开反斜杠。这是针对ASCII或Unicode字符数据的吗?您确定吗?它是什么编程语言?在不知道目标语言的情况下,没有合理的方法来创建正则表达式,因为相同的语法在不同的实现中可能意味着完全不同的内容。@tchrist这是针对Java的。)(正如巴特正确推断的那样)我已经用提供的被接受的答案运行了一些测试,并且工作良好(到目前为止):)答案只有ASCII码。希望足够。那么
\w{1,}
(\w+\.)+
(\w+(\.|$))+