【问题标题】:How to match repeated patterns?如何匹配重复的模式?
【发布时间】:2011-06-12 00:06:19
【问题描述】:

我想匹配:

some.name.separated.by.dots

但我不知道怎么做。

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

 \w+\.

我怎么说“重复”

【问题讨论】:

  • 这是用于 ASCII 还是 Unicode 字符数据 - 确定吗?它是什么编程语言?在不了解目标语言的情况下,没有合理的方法可以创建正则表达式,因为相同的语法在不同的实现中可能意味着完全不同的东西。
  • @tchrist 这是用于 Java 的(由 Bart 正确推断)我已经用提供的接受的答案运行了一些测试并且工作正常(到目前为止):)
  • 答案只有 ASCII。希望就够了。
  • \w{1,}怎么样

标签: java regex


【解决方案1】:

尝试以下方法:

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

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

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

编辑

[...](?:...) 的区别在于[...] 始终匹配单个字符。它被称为“字符集”或“字符类”。所以,[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() 是等价的:意思是“整个匹配”。

【讨论】:

  • 根据您的回答,我想出了这个:\w+[\.\w+]*(我想我稍后会需要这些括号)。你能解释一下为什么()[] 有效吗?
  • @Oscar:巴特的回答处理了这个问题。
  • @SilentGost 是的,我刚刚注意到:P(复制/粘贴错误)我的意思是说我使用[] 而不是(),但我无法真正理解其中的区别。我只知道前者不建群
  • @Bart: 当然\w+ 在某些正则表达式语言中会很好地匹配Unicode。一个 Java 正则表达式,表示 \w supposed 的意思是 [\pL\pM\p{Nd}\p{Nl}\p{Pc}[\p{InEnclosedAlphanumerics}&&\p{So}]]
  • @tchrist、\w[\pL\pM\p{Nd}\p{Nl}\p{Pc}\p{InEnclosedAlphanumerics}&&\p{So}]],有什么区别? :) 当然,某些实现确实有适当的 Unicode 支持。
【解决方案2】:

这也可以:

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

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

    • 谁投了我的票?如果我在某个地方出错了,我不介意更多地了解正则表达式,因为我对它们很陌生。是因为它将匹配foo.foo. 但不匹配foo.foo
    • 我没有对你投反对票(也没有对你投反对票),但从其他人的反对票来看,我会说是的,这就是原因。实际上你的正则表达式都不匹配我的字符串:(
    • 您可能需要转义反斜杠。
    【解决方案4】:
    (\w+\.)+
    

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

    【讨论】:

    • 这将需要一个尾随句点,与他的示例相反。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-25
    • 2020-10-27
    • 1970-01-01
    • 1970-01-01
    • 2011-10-14
    • 1970-01-01
    相关资源
    最近更新 更多