0

都市と州、または郵便番号のいずれかを許可する必要がある場所検索フィールドがあります。それぞれが別々に機能する 2 つの別々の正規表現パターンがありますが、それらを組み合わせる際に問題があります。

これは市と州用です。少なくとも 2 つの文字、次にコンマ、オプションの空白、さらに 2 つの文字があることを確認します。よく働く。

var str="abc, de";
var patt1 = /^[a-z]{2,},\s*[a-z]{2}$/i;
if(patt1.test(str)) {
    alert("true");
}
else {
    alert("false");
}

これは郵便番号用です。正確に 5 つの数字があることを確認します。また、動作します。

var str="01235";
var patt1 = /[0-9]{5}/;
if(patt1.test(str)) {
    alert("true");
}
else {
    alert("false");
}

括弧とパイプ記号を使用して、代替の一致を実行できることを知っています。過去 2 回、(xxx) xxx-xxxx または xxx-xxx-xxxx の 2 つの異なる電話番号形式に対して検証を行いました。

var pattern = /((^\([0-9]{3}\) [0-9]{3}[-]{1}[0-9]{4}$)|(^[0-9]{3}-[0-9]{3}[-]{1}[0-9]{4}$))/;

しかし、市/州と郵便番号のチェックでこれを実行しようとすると、うまくいきません。郵便番号を入力すると、正しく true が返されますが、都市と州のパターンが単独で使用されたときに正しく true が返されたとしても、都市と州のすべての組み合わせが false を返します。そして、2 番目の可能性では正確に 5 つの数字の要件を無視しているようです。5 つ未満の場合は false を返しますが、5 つを超える場合は true を返します。これのどこが間違っているのでしょうか?

var patt1 = /((^[a-z]{2,},\s*[a-z]{2}$\i)|(^[0-9]{5}))/;

ここにフィドルがあります:http://jsfiddle.net/EmmyS/fHkZU/

4

2 に答える 2

3

これのどこが間違っているのですか?

var patt1 = /((^[a-z]{2,},\s*[a-z]{2}$\i)|(^[0-9]{5}))/;

大文字と小文字を区別しない-修飾子を正規表現に移動しました (バックスラッシュでエスケープしますが、それは問題ではありません)。i文字列の終わりの後の文字と一致しようとします:-)

そして、2 番目の可能性では正確に 5 つの数字の要件を無視しているようです。5 個未満の場合は false を返しますが、5 個を超える場合は true を返します。

繰り返しますが、それらを固定するのを忘れています(少なくとも最後まで、組み合わせを試みると、文字列の開始点に固定されます).

訂正:

var patt1 = /(^[a-z]{2,},\s*[a-z]{2}$)|(^[0-9]{5}$)/i;
// or maybe easier:
var patt1 = /^([a-z]{2,},\s*[a-z]{2}|\d{5})$/i;

ただし、キャプチャ グループが必要な場所がわかりません。

両方のパターンを 1 つのひどい正規表現に結合するのではなく、両方をテストして JS でロジックを実行する方が簡単 (かつクリーンなコード) になる可能性があることに注意してください。

var str="…";
var patt1 = /^[a-z]{2,},\s*[a-z]{2}$/i, // city and state abbreviation
    patt2 = /^\d{5}$/; // or zip code
if(patt1.test(str) || patt2.test(str)) {
    alert("true");
} else {
    alert("false");
}
于 2013-07-19T19:07:09.240 に答える
1

あなたが尋ねたものではないことはわかっていますが、これを2つの別々のパターンとして保持します. それらは同じテキストボックスで作業しますが、2 つの異なる目的を果たします。メンテナンスが容易になります。

1 年後にこのパターンに戻ったとき、自信を持ってすばやく調整できるでしょうか。あなたはすでにそれに苦しんでいます。

cityStatePattern = "xxx"
zipPattern = "yyy"

//check for city, state or zipcode
fieldPatterno = "xxx|yyy"

私は毎回最初のオプションを使用します。

于 2013-07-19T19:14:07.830 に答える