2012-10-12 4 views
8

두 개의 정규 표현식이 있습니다. 하나는 CSV 문자열에서 사용자 이름을 꺼내고 다른 하나는 이메일을 꺼냅니다.2 개의 정규 표현식을 병합합니다.

문자열 형식은 다음과 같이이다 : 내 정규 표현식

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

당신은 그들 모두 일치하도록, 당신의 multiple Regex 사이에 Pipe (|)을 사용할 수 있습니다 : -

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] 

UPDATE : -

username 및을 인쇄하려면둘 다 존재하는 경우에만 ;에 문자열을 분할 한 다음 각각에 아래 정규식을 적용해야합니다.

여기에 코드입니다 : -

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

OUTPUT : - 귀하의 쌍을 추출합니다

username [email protected] 
username [email protected] // Only the last two have both username and email 
+0

나는 OP가 regexps를 원한다고 생각하지 않거나, OR –

+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가
USERNAME3의 ma[email protected][email protected]

  • \\(([^\\)]+)\\) : ()
  • \\s 둘러싸인 비 ) 문자의 기 정규식 "\\(([^\\)]+)\\)\\s<([^>]+)>"위한 DK는

설명에서 공간 <([^>]+)>

  • 간 : 그룹 비 > 문자는 <>으로 묶습니다.
    +0

    +1 꽤 간단합니다 :) –

    관련 문제