11

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

字符串格式是这样的:

String s = "name lastname (username) <mail@mail.something.dk>; name lastname (username) <mail@mail.something.dk>; name lastname (username) <mail@mail.something.dk>";

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

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"

我可以使用一个正则表达式从单个 matcher打印出相同的内容吗?

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

4

2 回答 2

16

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

    String s = "name lastname (username) <mail@mail.something.dk>; name lastname
            (username) <mail@mail.something.dk>; name lastname 
            (username) <mail@mail.something.dk>;";

    // 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

更新: -

如果要打印username并且email仅当它们都存在时,则需要拆分字符串;,然后在每个字符串上应用以下正则表达式。

这是代码: -

    String s = "name lastname (username) ; 
                name lastname (username) <mail@mail.something.dk>; 
                name lastname (username) <mail@mail.something.dk>;";

    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
于 2012-10-12T11:47:10.860 回答
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) <mail2@mail.something.dk>; name3 lastname3 (username3) <mail3@mail.something.dk>;";

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

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

输出:

用户名2 mail2@mail.something.dk
用户名3 mail3@mail.something.dk

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

  • \\(([^\\)]+)\\):由and)括起来的一组非字符()
  • \\s: 中间有空格
  • <([^>]+)>:由and>括起来的一组非字符<>
于 2012-10-12T12:59:13.200 回答