質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

置換

置換とは文字列中の特定の文字に対して、別の文字列に置き換えることを指します。

メール

メールは、コンピュータネットワークを利用し、 情報等を交換する手段のことです。

Q&A

解決済

4回答

1010閲覧

Java 正規表現を利用したプログラムについて質問

sion_.

総合スコア1

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

置換

置換とは文字列中の特定の文字に対して、別の文字列に置き換えることを指します。

メール

メールは、コンピュータネットワークを利用し、 情報等を交換する手段のことです。

0グッド

0クリップ

投稿2022/12/18 21:59

編集2022/12/18 22:31

前提

プログラミング初心者です。
質問を見ていただきありがとうございます。
Javaで正規表現を利用したプログラムを書いています。
コードを書いていて調べても分からないことがあったので質問させて頂きます。

実現したいこと

下記のようなコードを書いており、これを実行すると、
名前     メールアドレス
と表示されます。これを String reg = "([^<]*)<([^>*])>,?";
の部分を変更して
名前     @メールアドレスのドメイン名
となるプログラムに変更したいのですが、試行錯誤したのですがうまくいきません
メールアドレスから@とドメイン名を切り抜くには
どのように変更したらよいのでしょうか教えて頂きたいです。

発生している問題・エラーメッセージ

私の環境ではエラーは発生しませんでした。

名前   メールアドレスと表示される変更前のソースコード

Java
ソースコード

package exercise09_4; import java.util.regex.*; // 正規表現に関するクラスパッケージ public class Main { public static void main(String[] args) { // 検索するパターン String reg = "([^<]*)<([^>*])>,?"; // 名前<アドレス>, にマッチ // 検索対象の文字列 String str = "佐藤太郎<sato@yahoo.co.jp>, 高橋花子<takahashi@yahoo.co.jp>, 伊藤太郎<ito@yahoo.co.jp>, 加藤花子<kato@yahoo.co.jp>"; // マッチングの準備 Pattern p = Pattern.compile (reg); Matcher m = p.matcher(str); String result = m.replaceAll("$1\t$2\n"); // 結果の出力 System.out.println("元文:\n"+str+"\n置換後:\n"+result); } }

試したこと

私なりに考え、 String reg ="([^<]*)<([^>*])>,?";の部分を下記のように色々変更してみたり、インターネットで調べたのですがどれも@ドメイン名を切り抜けませんでした。

String reg = "([^<]*)<@([^>]*)([^@]*)>,?";
String reg = "([^<]*)<@([^@]*)([^>]*)>,?";
String reg = "([^<]*)<@*([^>]*)([^@]*)>,?";
String reg = "([^<]*)<@([^@]*)>,?";
String reg = "([^<]*)<[@]*([^>]*)([^@]*)>,?";
String reg = "([^<]*)<@*([^@]*)([^>]*)>,?";
String reg = "([^<]*)<@([^>]*)>,?";
String reg = "([^<]*)<[@]*([^@]*)([^>]*)>,?";

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

int32_t

2022/12/18 22:02

コード中の * が欠落して見えます。コードを ``` で囲んでください。
sion_.

2022/12/18 22:09

返信ありがとうございます。 *の欠落はどこのことでしょうか あとコードを ```で囲むのは質問してしまった後から変更できるのでしょうか 質問ばかりですみません。教えて頂きたいです。
sion_.

2022/12/18 22:15

*の欠落理解しました。質問を編集したいのですが、編集ボタンが見当たりません。 編集ボタンはどこに表示されるのでしょうか 教えて頂きたいです。
matukeso

2022/12/18 22:31

split("@")だとなにか良くない?
sion_.

2022/12/18 22:36

返信ありがとうございます。 String reg = "([^<]*)<split(@)([^@]*)([^>]*)>,?"; としてみたのですが、うまくいきませんでした。 間違えている箇所あったらご指摘お願いします。
int32_t

2022/12/18 22:41

``` か ` で囲っていれば * を全角で書く必要はありません。
jimbe

2022/12/19 08:50

「試したこと」にある一連のコードも囲った方が見易いです。
guest

回答4

0

java9からreplaceAllはFunctionを取る版がありますので、二段目をsplit使っても大丈夫なのでは。

java

1String reg = "([^<]*)<([^>]*)>,?" 2Pattern p = Pattern.compile (reg); 3Matcher m = p.matcher(str); 4String result = m.replaceAll(e -> e.group(1) + "\t" + e.group(2).split("@")[1]);

投稿2022/12/19 09:05

編集2022/12/19 09:58
matukeso

総合スコア1590

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

"(?:^|,)\s*(.+?)<.+?(@.+?)>"
最短一致で @ や <> が 1 回出てくるだけにしてみたり。

投稿2022/12/19 09:19

jimbe

総合スコア12632

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

< でない文字列が「名前」。
@ でない文字列を読み飛ばす。
@ から「> でない文字列」までが「@ドメイン名」。
>, とスペースを読み飛ばす。

String reg = "([^<]*)[^@]*(@[^>]*)>,? *";

投稿2022/12/19 03:07

編集2022/12/19 03:09
kazuma-s

総合スコア8224

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

m.group(2).split("@")[1] がドメイン部分になりますので、result = m.group(1) + "\t" + m.group(2).split("@")[1] + "\n" でよいでしょう。
↑複数回のマッチが必要なのでこの方法はあまり参考になりませんね。

正規表現で解決したい場合は、<([^>]*)> (グループ2がメールアドレス全体をキャプチャ)を <[^>@]*@([^>]*)> (グループ2がメールアドレスの@以降だけキャプチャ)にすればよいです。

投稿2022/12/18 22:41

編集2022/12/18 23:29
int32_t

総合スコア20832

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問