🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Java

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

正規表現

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

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

Q&A

解決済

2回答

2328閲覧

Javaで正規表現を利用してフォーマットチェックをしたい

yamadataro3

総合スコア12

Java

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

正規表現

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

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

1グッド

1クリップ

投稿2020/12/25 23:49

Javaで正規表現を利用してフォーマットチェックをしたいのですが、
調べたのですが正規表現での記載方法がわかりません。
チェックしたいのは以下の2パターンです。

["0.8","1.2"]
ダブルクォーテーションで囲まれた小数点第1位までの数値
がカンマ区切りで任意の数あるパターン。
いちばん外側は鍵かっこで囲む。

"[0.79,5.86]"
小数点第2位までの数値がカンマ区切りで任意の数あるパターン。
それを鍵かっこで囲み、さらにいちばん外側はダブルクォーテーションで囲む。

正規表現でどのように記載したらよいのか
ご教示お願いできませんでしょうか。

kozuchi👍を押しています

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

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

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

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

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

guest

回答2

0

ありがとうございました。
できました。助かりました。

投稿2020/12/28 01:34

yamadataro3

総合スコア12

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

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

0

ベストアンサー

結論

ご質問の条件に適合すると思われる正規表現そのテストプログラムを私なりに作ってみたコードが以下です。
あまり厳密にはテストしていないので、間違いがあるかもしれません、また、ゼロ桁、ゼロ個の許容など、
憶測で作っている部分もありますので、以下のパターンは参考程度にお考え下さい、そのまま使うとご期待通りに動かない場合がある可能性があります。
また、Java5 でやっていますので、最近の Java を使うと表記が簡略化できる部分があるかもしれません。

1つ目

Java

1import java.util.regex.Matcher; 2import java.util.regex.Pattern; 3 4/* 5要件と解説 6 7■要件 8["0.8","1.2"] 9ダブルクォーテーションで囲まれた小数点第1位までの数値 10がカンマ区切りで任意の数あるパターン。 11いちばん外側は鍵かっこで囲む。 12 13■解説 14・要素構造 15<対象パターン> := <鍵かっこ開>(<ダブルクォーテーション><小数点第1位までの数値><ダブルクォーテーション><カンマ>)*<ダブルクォーテーション><小数点第1位までの数値><ダブルクォーテーション><鍵かっこ閉> 16※数値が一つもない場合は非マッチ 17※タブ、空白の挿入は考慮せず 18 19・各要素の正規表現 20<鍵かっこ開> := [ 21<ダブルクォーテーション> := " 22<小数点第1位までの数値> := [0-9]*.[0-9] ※整数部がゼロ桁の場合を許容、小数部ゼロ桁はマッチせず 23<カンマ> := , 24<鍵かっこ閉> := ] 25 26・要素構造を正規表現に置き換え 27[("[0-9]*.[0-9]",)*"[0-9]*.[0-9]"] 28 29 */ 30public class NumberDataMatchTestSample { 31 32 public static void main(String[] args) { 33 // 正規表現 34 String pattern = "\[(\"[0-9]*\.[0-9]\",)*\"[0-9]*\.[0-9]\"\]"; 35 36 // マッチすることが期待される文字列の配列 37 String match_strings[] = { 38 "[\"0.8\",\"1.2\"]", 39 "[\"0.8\"]" // 数値数1 40 }; 41 42 // マッチしないことが期待される文字列の配列 43 String unmatch_strings[] = { 44 "\"1.2\"", /* 鍵かっこが無い */ 45 "[]", /* 数値が一つもない */ 46 "[\"0.88\"]", /* 小数点以下二桁 */ 47 "[0.88]", /* ダブルクォートがない */ 48 "[\"0.8\"\"1.2\"]" /* ,で区切られていない */ 49 }; 50 51 // 以下テスト 52 System.out.printf("regex: %s\n", pattern); 53 Pattern reg_pattern = Pattern.compile(pattern); 54 55 // マッチするはずの文字列とマッチすることの確認 56 System.out.printf("- Match patterns ---\n"); 57 for (String target : match_strings) { 58 System.out.printf("target: %s\n", target); 59 Matcher matcher = reg_pattern.matcher(target); 60 System.out.printf("result: %b\n",matcher.matches()); 61 } 62 63 // マッチしないはずの文字列とマッチしないことの確認 64 System.out.printf("- UnMatch patterns ---\n"); 65 for (String target : unmatch_strings) { 66 System.out.printf("target: %s\n", target); 67 Matcher matcher = reg_pattern.matcher(target); 68 System.out.printf("result: %b\n",matcher.matches()); 69 } 70 } 71 72 73 74}

2つ目

Java

1import java.util.regex.Matcher; 2import java.util.regex.Pattern; 3/* 4要件と解説 5 6■要件 7"[0.79,5.86]" 8小数点第2位までの数値がカンマ区切りで任意の数あるパターン。 9それを鍵かっこで囲み、さらにいちばん外側はダブルクォーテーションで囲む。 10 11 12■解説 13・要素構造 14<対象パターン> := <ダブルクォーテーション><鍵かっこ開>(<小数点第2位までの数値><カンマ>)*<小数点第2位までの数値><鍵かっこ閉><ダブルクォーテーション> 15※数値が一つもない場合は非マッチ 16※タブ、空白の挿入は考慮せず 17 18・各要素の正規表現 19<ダブルクォーテーション> := " 20<鍵かっこ開> := [ 21<小数点第2位までの数値> := [0-9]*.[0-9]?[0-9]* ※整数部がゼロ桁の場合を許容、小数部は1桁以下はマッチせず 22<カンマ> := , 23<鍵かっこ閉> := ] 24 25・要素構造を正規表現に置き換え 26"[([0-9]*.[0-9]?[0-9]*,)*[0-9]*.[0-9]?[0-9]*]" 27 28 */ 29public class NumberDataMatchTestSample2 { 30 31 public static void main(String[] args) { 32 // 正規表現 33 String pattern = "\"\[([0-9]*\.[0-9]?[0-9]*,)*[0-9]*\.[0-9]?[0-9]\]\""; 34 35 // マッチすることが期待される文字列の配列 36 String match_strings[] = { 37 "\"[0.79,5.86]\"", 38 "\"[0.7,5.8]\"" // 小数点以下1桁 39 }; 40 41 // マッチしないことが期待される文字列の配列 42 String unmatch_strings[] = { 43 "\"1.2\"", /* 鍵かっこが無い */ 44 "\"[]\"", /* 数値が一つもない */ 45 "\"[0.888]\"", /* 小数点以下三桁 */ 46 "[0.88]", /* ダブルクォートがない */ 47 "\"[0.81.2]\"" /* ,で区切られていない */ 48 }; 49 50 // 以下テスト 51 System.out.printf("regex: %s\n", pattern); 52 53 // マッチするはずの文字列とマッチすることの確認 54 Pattern reg_pattern = Pattern.compile(pattern); 55 System.out.printf("- Match patterns ---\n"); 56 for (String target : match_strings) { 57 System.out.printf("target: %s\n", target); 58 Matcher matcher = reg_pattern.matcher(target); 59 System.out.printf("result: %b\n",matcher.matches()); 60 } 61 62 // マッチしないはずの文字列とマッチしないことの確認 63 System.out.printf("- UnMatch patterns ---\n"); 64 for (String target : unmatch_strings) { 65 System.out.printf("target: %s\n", target); 66 Matcher matcher = reg_pattern.matcher(target); 67 System.out.printf("result: %b\n",matcher.matches()); 68 } 69 } 70 71 72 73}

概要説明

複数の条件がある正規表現の場合は、構成要素を分解して順番に下位の要素から作っていきます。

1. 要素構造を決める: マッチすべき文字列の構成要素と構造を決める
2. 各要素を正規表現に置き換える: 各構成要素に適合する正規表現を作る
3. 組み立て: 2で作った正規表現を組み合わせて、全体の条件にマッチする正規表現を作る

ちなみに、このようにして作った複雑な正規表現がうまくマッチしない場合は、全体で無理にテストせずに、
2 の段階の各要素の正規表現について個々にテストした方が解決が早い場合が多いです。

手順説明

正規表現を考える手順に関して、1つめを例に以下で説明します。

ご質問の1つ目の条件は以下のような内容でしたので、

>ダブルクォーテーションで囲まれた小数点第1位までの数値 >がカンマ区切りで任意の数あるパターン。 >いちばん外側は鍵かっこで囲む。

各条件を要素の構造に置き換えていきます

1. 1行目

1-1.要素構造を決める
>ダブルクォーテーションで囲まれた小数点第1位までの数値

上の条件を構成する要素(<>で括った部分)とその構造に置き換えます

<ダブルクォーテーション><小数点第1位までの数値><ダブルクォーテーション>
1-2.各要素を正規表現に置き換える

各要素を正規表現に置き換えます

<ダブルクォーテーション> → " <小数点第1位までの数値> → [0-9]*.[0-9] ※整数部ゼロ桁を許容するパターンになっています
1-3.組み立て

「要素構造」の各要素を上で決めた正規表現に置き換えます

<ダブルクォーテーション><小数点第1位までの数値><ダブルクォーテーション> ↓ "[0-9]*.[0-9]"

2. 2行目

2-1.要素構造を決める
がカンマ区切りで任意の数あるパターン。

この場合「任意の数あるパターン」という構造を表現するために、
正規表現の「()」(グループ)、「*」(0個以上任意個)をこの段階で使っています。
※この場合、数値(1行目の構造)の数がゼロ個の場合はマッチしない前提になります、ゼロ個を許容する場合は変更が必要です

(<1行目の構造><カンマ>)*<1行目の構造>
2-2.各要素を正規表現に置き換える

各要素を正規表現に置き換えます

<1行目の構造> → "[0-9]+.[0-9]" <カンマ> → ,
2-3.組み立て

「要素構造」の各要素を上で決めた正規表現に置き換えます

(<1行目><カンマ>)*<1行目> ↓ ("[0-9]+.[0-9]",)*"[0-9]+.[0-9]"

3. 3行目

3-1.要素構造を決める
いちばん外側は鍵かっこで囲む。
<鍵かっこ開><2行目までの構造><鍵かっこ閉>
3-2.各要素を正規表現に置き換える

「要素構造」の各要素を正規表現に置き換えます

<鍵かっこ開> → [ <2行目までの構造> → ("[0-9]+.[0-9]",)*"[0-9]+.[0-9]" <鍵かっこ閉>→ ]
3-3.組み立て

「要素構造」の各要素を上で決めた正規表現に置き換えます

<鍵かっこ開><2行目までの構造><鍵かっこ閉> ↓ [("[0-9]+.[0-9]",)*"[0-9]+.[0-9]"]

4. Java文字列への置き換え

正規表現で使う文字列には、Java の文字列表記ではエスケープする必要のある文字(ダブルクォート、バックスラッシュ)
が含まれるので、これらをエスケープした文字列に置き換えます。
※ファイルから正規表現を読み込むような場合はこの処理は不要です

Java文字列へのエスケープ

1[("[0-9]+.[0-9]",)*"[0-9]+.[0-9]"] 23\[(\"[0-9]+\.[0-9]\",)\"[0-9]+\.[0-9]\"\]

投稿2020/12/26 03:48

編集2020/12/26 03:55
kozuchi

総合スコア1193

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問