2012-10-12 23 views
8

İki düzenli ifadem var; biri bir csv dizesinden kullanıcı adlarını çekiyor, diğeri de e-postaları çekiyor.iki düzenli ifadeyi birleştirin

dize biçimi şu şekildedir: benim normal ifadeler için

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

kod bu şekildedir.

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

Ben birleştirme regexes hakkında çeşitli qeustions buldum ama yanıtlarından i mayın birleştirmek için nasıl anlamaya edemedik.

benim çıktılar gösterir:

"username [email protected]" 

Bir regex kullanarak, bir tek Eşleştirici aynı üzerinden baskı mümkün olacaktır?

obs: Bu bir okul ödevidir, yani onları birleştirmek veya daha fazlasını yapmak için "ihtiyacım" yoktur, ancak mümkün olup olmadığını ve ne kadar zor olacağını bilmek isterim.

cevap

10

Sadece hepsini eşleştirmek için multiple Regex arasında bir Pipe (|) kullanabilirsiniz: -

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

ÇIKIŞ: -

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

GÜNCELLEME: -

username ve'ü yazdırmak istiyorsanızyalnızca ikisi de var olduğunda, dizenizi ; üzerinde bölmeniz ve ardından her biri için aşağıdaki Regex'i uygulamanız gerekir.

İşte kod: -

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

ÇIKIŞ: - senin çiftleri çıkartacaktır

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

Ben OP için AND regexpleri değil VEYA onları –

+0

@AdamDyga o tek regex hem kullanıcı adı ve e-posta istediği hiçbir istiyor sanırım .. Bkz Bir regex? ' –

+0

küçük bir fark vardır, OPs kodu (' (matcher.find() && matcher2.find()) ', yazdırılabilmesi için hem kullanıcı adı hem de postanın dizgede olması gerekir. –

1

Aşağıdaki kodu. Regex oldukça kısa, ama neredeyse eminim, daha zarif bir yol var (her zaman regex ile var!). ;)

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

Çıkış:

kullaniciadi2
USERNAME3 [email protected] [email protected]

  • \\(([^\\)]+)\\): ( ve )
  • \\s çevrelediği olmayan ) karakter bir grup: düzenli ifade "\\(([^\\)]+)\\)\\s<([^>]+)>" için dk

açıklama bir boşluk <([^>]+)>

  • arasında: bir grup < ve > tarafından sağlanan > karakterleri kullanarak, `ı tek Eşleştirici aynı yazdırmak mümkün olacaktır: -
    +0

    +1 bu oldukça basittir :) –

    İlgili konular