3

正規表現との不一致を引き起こす文字列 (そのインデックス) から最初の文字を出力することは可能ですか? 正規表現マッチング操作を使用するだけで可能ですか、それとももっと複雑なものを採用する必要がありますか?

たとえば、JavaScript では、/^\d{3}\s\d{2}$/3 桁の文字列とそれに続く空白と別の 2 桁の文字列に一致する正規表現があるとします。"123a45"この正規表現を適用する文字列があります。正規表現が一致しないため、これを実行すると (例: "123a45".match(/^\d{3}\s\d{2}$/)) が返されます。この不一致を引き起こす最初の文字 (この場合、インデックス 3 の文字)nullを取得するにはどうすればよいですか?"a"

この使用例の 1 つは、検証に使用される正規表現に従って、ユーザーが入力した文字列を無効にする文字をユーザーに直接ポイントすることです。

4

2 に答える 2

3

正規表現パターンを、部分一致の可能性のあるすべての一致パターンに分割し、そのようなパターンのリストを最長一致から最短一致 (またはなし) に並べる必要があります。一致が得られたら、(部分) 一致の長さを計算すると、不一致の原因となった文字の位置が得られます。その位置からの 1 文字の長さの部分文字列は、この不一致の背後にある文字とまったく同じです (ある場合)。不一致がない場合は、空の (サブ) 文字列を返します。

var s = "123a45";
alert(s.substr(s.match(/^(\d{3}\s\d{2}|\d{3}\s\d|\d{3}\s|\d{0,3})/)[1].length,1));

http://jsfiddle.net/ETWWS/

于 2012-07-21T19:58:08.390 に答える
2

入力が無効な理由について詳細な説明を提供するには、小さなパーサーを作成し、代わりにフィードバックを提供することをお勧めします。問題の原因となっている文字をユーザーに指摘し、より有用で的を絞ったエラー メッセージを表示することができます。

パーサーでは、正規表現を使用して文字列内の特定のプロパティをアサートし、ターゲットを絞ったエラー メッセージを生成できます。たとえば、入力に 6 文字を含める必要があり、最初の 3 文字が数字で、最後の 3 文字がアルファベット文字である場合、ユーザーにエラーを報告する入力の長さをアサートする正規表現を記述できます。

または、これまで使用していた正規表現を使用して、一般的なエラー メッセージを表示します (正しく入力する方法についての役立つ説明付き)。通常のユーザーは、多くても 2 ~ 3 回の試行でデータを正しく入力できるはずです。その上、悪意のあるユーザーであるか、入力するデータがすべてのユーザーに適用されるわけではないか、またはあなたの指示が不足している可能性があります。

于 2012-07-21T20:09:28.333 に答える