Javaで正規表現を利用してフォーマットチェックをしたいのですが、
調べたのですが正規表現での記載方法がわかりません。
チェックしたいのは以下の2パターンです。
["0.8","1.2"]
ダブルクォーテーションで囲まれた小数点第1位までの数値
がカンマ区切りで任意の数あるパターン。
いちばん外側は鍵かっこで囲む。
"[0.79,5.86]"
小数点第2位までの数値がカンマ区切りで任意の数あるパターン。
それを鍵かっこで囲み、さらにいちばん外側はダブルクォーテーションで囲む。
正規表現でどのように記載したらよいのか
ご教示お願いできませんでしょうか。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答2件
0
ありがとうございました。
できました。助かりました。
投稿2020/12/28 01:34
総合スコア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]"] 2↓ 3\[(\"[0-9]+\.[0-9]\",)\"[0-9]+\.[0-9]\"\]
投稿2020/12/26 03:48
編集2020/12/26 03:55総合スコア1193
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。