java - 如何使用正则表达式在同一行捕获可变数量的模式?
问题描述
因此,我被要求创建一个读取字符、使用正则表达式提取信息并将其打印出来以进行分配的 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,它只打印出最新的地址,并且地址列在所有仅包含一个地址的行之后。这是一个问题,因为我希望它们按顺序打印出来。
解决方案
您拥有的示例正则表达式使用$
与输入结束匹配的模式。因此,它只能匹配一次。这是您尝试做的事情的一个坏例子。
相反,让我们保持简单:将电子邮件地址定义为@
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
推荐阅读
- android - 在基于 Web 的应用程序中,如何将用户的 IMEI / UDID 调用到基于 Web 的应用程序 URL 的末尾?
- list - Xamarin 表单列表视图项目不显示
- python - 使用 wxpython 时如何在 StyledTextCtrl 中创建可用的多个光标?
- css - React JS:应用 Material-UI CssBaseline
- android - Kotlin 中的最大数组大小
- javascript - Angular 6 Bootstrap 4 必须在菜单选项卡上单击两次
- regex - 在匹配正则表达式的行的开头附加文本
- python - 浮点填充错误 Python
- sql - SQL对同一个人的最近记录按年份排序/排序
- python - 模拟在unittest python中使用成员变量的类的私有函数