我有两个正则表达式,一个从 csv 字符串中提取用户名,另一个提取电子邮件。
字符串格式是这样的:
String s = "name lastname (username) <mail@mail.something.dk>; name lastname (username) <mail@mail.something.dk>; name lastname (username) <mail@mail.something.dk>";
我的正则表达式的代码是这样的。
Pattern pattern = Pattern.compile("(?<=\\()[^\\)]+");
Matcher matcher = pattern.matcher(s);
Pattern pattern2 = Pattern.compile("((?<=<)[^>]+)");
Matcher matcher2 = pattern2.matcher(s);
while (matcher.find() && matcher2.find()) {
System.out.println(matcher.group() + " " + matcher2.group());
}
我发现了几个关于合并正则表达式的问题,但从答案中我无法弄清楚如何合并我的。
我的打印输出显示:
"username mail@mail.com"
我能否使用一个正则表达式从单个匹配器打印出相同的内容?
obs:这是一项学校作业,这意味着我“不需要”合并它们或做更多的事情,但我想知道这是否可能,以及它会有多难。
最佳答案
您可以在多个正则表达式
之间使用竖线(|)
来匹配它们:-
String s = "name lastname (username) <mail@mail.something.dk>; name lastname
(username) <mail@mail.something.dk>; name lastname
(username) <mail@mail.something.dk>;";
// Matches (?<=\\()[^\\)]+ or ((?<=<)[^>]+)
Pattern pattern = Pattern.compile("(?<=\\()[^\\)]+|((?<=<)[^>]+)");
Matcher matcher = pattern.matcher(s);
while (matcher.find()) {
System.out.println(matcher.group());
}
输出:-
username
mail@mail.something.dk
username
mail@mail.something.dk
username
mail@mail.something.dk
更新:-
如果你想打印 username
和 email
只有当它们都存在时,那么你需要在 ;
上拆分你的字符串然后应用以下每个正则表达式。
这是代码:-
String s = "name lastname (username) ;
name lastname (username) <mail@mail.something.dk>;
name lastname (username) <mail@mail.something.dk>;";
String [] strArr = s.split(";");
for (String str: strArr) {
Pattern pattern = Pattern.compile("\\(([^\\)]+)(?:\\))\\s(?:\\<)((?<=<)[^>]+)");
Matcher matcher = pattern.matcher(str);
while (matcher.find()) {
System.out.print(matcher.group(1) + " " + matcher.group(2));
}
System.out.println();
}
输出:-
username mail@mail.something.dk
username mail@mail.something.dk // Only the last two have both username and email
关于java - 合并两个正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12858116/