首页 > 解决方案 > 如何使用正则表达式在同一行捕获可变数量的模式?

问题描述

因此,我被要求创建一个读取字符、使用正则表达式提取信息并将其打印出来以进行分配的 java 文件。我对正则表达式不太了解,但假设每一行只包含我需要的文本的一个示例或不包含任何文本示例,我可以完成作业。但是当我尝试在同一行上收集多段文本时,问题就出现了。特别是如果该行中有我不应该阅读的文本。

例如;

[这是一个示例行,我可能必须阅读 example@such.com 并且我必须额外添加用户名地址 pleasehelpme@such.com 看到了吗?]

如果您可以用外行的方式解释您的答案,那将有很大帮助。

我已经尝试查找答案,但我能找到的最接近答案的是https://www.vogella.com/tutorials/JavaRegularExpressions/article.html,这是一个基本的正则表达式页面和一个显示扫描两个不同示例的站点模式。我只想说,我对此很陌生,我真的可以使用帮助。

Pattern pat = Pattern.compile("\\S*([a-zA-Z]+)@$");
    Matcher mat = pat.matcher(texttoread[i]);
        while(mat.find()) 
        {
           Holdingvar = Holdingvar + mat.group();
    }
//Keep in mind that this still needs to be loaded into an array so that I can 
//print them all out.

正如我之前所说,如果一行只包含我想要的内容之一或不包含我想要的内容,它会非常有效。在这种情况下,它会打印地址的名称。

Overwise,它只打印出最新的地址,并且地址列在所有仅包含一个地址的行之后。这是一个问题,因为我希望它们按顺序打印出来。

标签: javaregex

解决方案


您拥有的示例正则表达式使用$与输入结束匹配的模式。因此,它只能匹配一次。这是您尝试做的事情的一个坏例子。

相反,让我们保持简单:将电子邮件地址定义为@at 符号,前后带有文本,并将文本定义为“非空格”。

正则表达式将是:\S+@\S+
即一个或多个“非空格”,一个@符号,然后是一个或多个“非空格”。

此模式可以在一个字符串中多次匹配:

String input = "Here is an example line that I might have to read example@such.com and I have to extra the username addresses pleasehelpme@such.com see?";

Pattern p = Pattern.compile("\\S+@\\S+");
Matcher m = p.matcher(input);
while (m.find()) {
    System.out.println(m.group());
}

输出

example@such.com
pleasehelpme@such.com

推荐阅读