我有两个正则表达式,一个从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:这是一项学校作业,这意味着我“不需要”将它们合并或做更多,但我想知道它是否可能,以及它有多难。
答案 0 :(得分:11)
您可以在Pipe (|)
之间使用multiple Regex
,以匹配所有人: -
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
存在时才打印,则需要在;
上拆分字符串,然后在每个字符串上应用以下正则表达式。< / p>
这是代码: -
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
答案 1 :(得分:1)
以下代码将提取您的对。正则表达式很短,但我几乎可以肯定,有一种更优雅的方式(总是有正则表达式!)。 ;)
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Main {
public static void main(String[] args) {
String s = "name1 lastname1 (user1); name2 lastname2 (username2) <mail2@mail.something.dk>; name3 lastname3 (username3) <mail3@mail.something.dk>;";
Pattern pattern = Pattern.compile("\\(([^\\)]+)\\)\\s<([^>]+)>");
Matcher matcher = pattern.matcher(s);
while (matcher.find()) {
System.out.println(matcher.group(1) + " " + matcher.group(2));
}
}
}
输出:
username2 mail2@mail.something.dk
username3 mail3@mail.something.dk
正则表达式"\\(([^\\)]+)\\)\\s<([^>]+)>"
的解释:
\\(([^\\)]+)\\)
:由)
和(
)
个字符
\\s
:介于两者之间的空格<([^>]+)>
:由>
和<
>
个字符