2012-10-12 41 views
8

Tengo dos expresiones regulares, una sacando nombres de usuario de una cadena csv, y la otra sacando correos electrónicos.fusionar dos expresiones regulares

formato de la cadena es la siguiente:

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

el código para mis expresiones regulares son así.

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

he encontrado varios qeustions sobre expresiones regulares que se fusionan, pero a partir de las respuestas que no he sido capaz de averiguar cómo combinar la mía.

mis impresiones muestran:

"username [email protected]" 

sería yo capaz de copia impresa del mismo de una sola matcher, utilizando una expresión regular?

obs: esta es una tarea de la escuela, lo que significa que no "necesito" combinarlas o hacer más, pero me gustaría saber si es posible y qué tan difícil sería.

Respuesta

10

sólo puede utilizar un Pipe (|) en medio de su multiple Regex, para que coincida con todos ellos: -

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

SALIDA: -

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

ACTUALIZACIÓN: -

Si desea imprimir username y email solo cuando ambos existan, luego deberá dividir su cadena en ; y luego aplicar la Regex a continuación en cada uno de ellos.

Aquí está el código: -

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

SALIDA: -

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

Supongo que OP quiere Y expresiones regulares, no O –

+0

@ AdamDyga No, él quiere tanto el nombre de usuario como el correo electrónico de la expresión regular ... Ver: - '¿Podría imprimir lo mismo desde un solo comparador, usando un regex? ' –

+0

hay una pequeña diferencia, el código OPs (' (matcher.find() && matcher2.find()) 'requiere que tanto el nombre de usuario como el correo estén en la cadena para poder ser impresos. –

1

El siguiente código extraerá sus pares. La expresión regular es bastante corta, pero estoy casi seguro, hay una manera más elegante (¡siempre lo hay con expresiones regulares!). ;)

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

de salida:

nombredeusuario2 [email protected]~~V~~plural~~3rd
[email protected] USERNAME3.dk

Explicación de la expresión regular "\\(([^\\)]+)\\)\\s<([^>]+)>":

  • \\(([^\\)]+)\\): Un grupo de ) caracteres no encerrada por ( y )
  • \\s: Un espacio entre
  • <([^>]+)>: Un grupo de no > caracteres encerrados entre < y >
+0

+1 eso es bastante simple :) –

Cuestiones relacionadas