2012-10-12 104 views
8

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

字符串格式是这样的:

String s = "name lastname (username) <[email protected]>; name lastname (username) <[email protected]>; name lastname (username) <[email protected]>"; 

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

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()); 
} 

我已经发现了几个qeustions关于合并的正则表达式,但是从我的答案一直无法弄清楚如何合并我的。

我的打印输出显示:

"username [email protected]" 

我将能够打印出从单一匹配相同,使用正则表达式的一个?

obs:这是一个学校作业,这意味着我不需要“合并它们或做更多的事情,但我想知道它是否可能,以及它会有多困难。

回答

10

你可以只使用一个Pipe (|)multiple Regex之间,以匹配所有的人: -

String s = "name lastname (username) <[email protected]>; name lastname 
      (username) <[email protected]>; name lastname 
      (username) <[email protected]>;"; 

    // Matches (?<=\\()[^\\)]+ or ((?<=<)[^>]+) 
    Pattern pattern = Pattern.compile("(?<=\\()[^\\)]+|((?<=<)[^>]+)"); 
    Matcher matcher = pattern.matcher(s); 

    while (matcher.find()) { 
     System.out.println(matcher.group()); 
    } 

输出: -

username 
[email protected] 
username 
[email protected] 
username 
[email protected] 

更新: -

如果你想打印usernameemail只有当它们都存在时,那么你需要分割你的字符串;,然后在它们中的每一个上应用下面的正则表达式。

下面的代码: -

String s = "name lastname (username) ; 
       name lastname (username) <[email protected]>; 
       name lastname (username) <[email protected]>;"; 

    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 [email protected] 
username [email protected] // Only the last two have both username and email 
+0

我猜想OP想要和正则表达式,而不是他们 –

+0

@AdamDyga不,他希望用户名和电子邮件来自单个正则表达式。请参阅: - '我能够打印出相同的单一匹配器,使用一个正则表达式?' –

+0

有一个小的差异,OPs代码('(matcher.find()&& matcher2.find())'要求用户名和邮件必须在字符串中以便打印。 –

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) <[email protected]>; name3 lastname3 (username3) <[email protected]>;"; 

     Pattern pattern = Pattern.compile("\\(([^\\)]+)\\)\\s<([^>]+)>"); 
     Matcher matcher = pattern.matcher(s); 

     while (matcher.find()) { 
      System.out.println(matcher.group(1) + " " + matcher.group(2)); 
     } 
    } 
} 

输出:

USERNAME2 [email protected]
USERNAME3 [email protected]。DK

解释为正则表达式"\\(([^\\)]+)\\)\\s<([^>]+)>"

  • \\(([^\\)]+)\\):由()
  • \\s包围的组非)字符:甲空间
  • 之间
  • <([^>]+)>:A组的非><>包围的字符
+0

+1这很简单:) –