11

私は 2 つの正規表現を持っています。1 つは csv 文字列からユーザー名を取り出し、もう 1 つは電子メールを取り出します。

文字列形式は次のようになります。

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"

1 つの正規表現を使用して、1 つの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<([^>]+)>":

  • \\(([^\\)]+)\\):とで)囲まれた非文字のグループ()
  • \\s: 間のスペース
  • <([^>]+)>:とで>囲まれた非文字のグループ<>
于 2012-10-12T12:59:13.200 に答える