2016-07-10 6 views
1

私は、2つのことをチェックする単一のRegExp文字列を定義することが可能だと思います - ユーザーがポストオフィスボックスに入ろうとしていないかどうか、そしてユーザーが有効な文字のみを使用しているかどうか。否定と正の正規表現を結合するには?

PO BOX検証を:次のように2つの別々の正規表現は、これらのシャアを入力することができ

^((?!^.*(\b[Pp]([Oo0][Ss][Tt])?\.*\s*[Oo0]([Ff][Ff]([Ii][Cc][Ee])?)?\.*\s*([Bb][Oo0][Xx])\d*\s*\b.*)).)*$ 

ユーザーのみ:

^[a-z|A-Z|0-9 _&'/#]*$ 

私は単純に縦に2つの正規表現のを連結しようとすると、 'OR'文字 '|'、それは望ましい結果を達成しません。これも可能ですか? 1つの正規表現で両方の検証を行うことはできますか?

+0

と同じように書くことができます望ましい結果は何ですか? '|'を使うのは論理ORです。また、カッコで区切っています: '(regexp1)|(regexp2)'? –

+0

ありがとうございます。その構文は何ですか? – okorng

+0

@ブラッドどのように正規表現が "郵便局"と一致するように正規表現が変更されましたか?あなたの編集時に現れたので、私はそれを元に戻しました。 – 4castle

答えて

1

独自の正規表現を組み合わせて使用​​する場合、最初の正規表現は、実際には一種の貧弱な貪欲なトークンを持つパターンです。

あなたがそれらがリテラルパイプシンボルとして扱われるようあなたはおそらくORとしてそれらを使用することを意図しながら[a-z|A-Z|0-9 _&'/#]は、|を含めるべきではないことregex demo

注を参照してください

/^(?!.*\b[Pp]([Oo0][Ss][Tt])?\.*\s*[Oo0]([Ff][Ff]([Ii][Cc][Ee])?)?\.*\s*([Bb][Oo0][Xx])\d*\s*\b)[a-zA-Z0-9 _&'\/#]*$/ 
                           ^^^^^^^^^^^^^^^^^^ 

のようなものを望んでいたようです演算子。それらはカッコ内のOR演算子ですが、文字クラス内にはありません。

パターンは詳細:

  • ^ - 文字列の先頭
  • (?!.*\b[Pp]([Oo0][Ss][Tt])?\.*\s*[Oo0]([Ff][Ff]([Ii][Cc][Ee])?)?\.*\s*([Bb][Oo0][Xx])\d*\s*\b) - それ内部のパターンが
  • [a-zA-Z0-9 _&'/#]*一致した場合、一致を失敗否定先読み - ゼロまたはそれ以上の許可文字
  • $ - 文字列の最後。 = \w[a-zA-Z0-9_]以来

、あなたが

/^(?!.*\b[Pp]([Oo0][Ss][Tt])?\.*\s*[Oo0]([Ff][Ff]([Ii][Cc][Ee])?)?\.*\s*([Bb][Oo0][Xx])\d*\s*\b)[\w &'\/#]*$/ 
+0

ありがとうございます。私はこれを試してみましょう。 – okorng

+1

恐ろしい!あなたの上記の解決策が働いているようです。ユーザーが郵便箱を挿入しようとするのを防ぎ、無効な文字を防止します!お手伝いありがとう。 – okorng

+0

case-insensitveモードを使用すると便利です。私はそれが正規表現自体を解析する時間以外にあまりにも最適化するとは思わないが、はるかに読みやすくなります。 – 4castle

関連する問題