合并两个正则表达式

我有两个正则表达式,一个从csv字符串中提取用户名,另一个从中提取电子邮件。

字符串格式是这样的:

String s = "name lastname (username) ; name lastname (username) ; name lastname (username) "; 

我的正则表达式的代码是这样的。

 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:这是一项学校作业,这意味着我“不需要”将它们合并或做更多,但我想知道它是否可能,以及它有多难。

您可以在multiple Regex之间使用Pipe (|)来匹配所有这些: –

  String s = "name lastname (username) ; name lastname (username) ; name lastname (username) ;"; // 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 

更新 : –

如果您只想在两者都存在时打印usernameemail ,那么您需要拆分字符串; 然后在每个上面应用以下正则表达式。

这是代码: –

  String s = "name lastname (username) ; name lastname (username) ; name lastname (username) ;"; 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 

以下代码将提取您的对。 正则表达式很短,但我几乎可以肯定,有一种更优雅的方式(总是有正则表达式!)。 ;)

 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) ; name3 lastname3 (username3) ;"; 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 :介于两者之间的空间
  • <([^>]+)> :由<>括起来的一组非>字符