-2

私は正規表現の経験がまったくないので、文字列と一致するように正規表現を設定するのに助けが必要です。これは電話番号の検証用です。ユーザーが入力する文字列に、大文字のAZ、数字の0〜9、開き/閉じ括弧[()]、およびハイフン(-)のみが含まれていることを確認する必要があります。また、matchまたはstringのいずれかを使用する必要があるstringメソッドもわかりません。

4

1 に答える 1

1

正規表現は、Web 全体であまり説明されていません。私はそれについてより一般的な質問をしたことで誰かを責めません. あなたが尋ねたキャラクター:

[A-Z]
[0-9] or \d
\(
\)

-

/matchme/正規表現リテラルです。これは、RegExp コンストラクターを使用するよりも望ましい方法です。

実際には、replace、split などの多くの文字列メソッドで regEx リテラルを使用できます。

特殊文字が続かない場合、非特殊文字は、文字列内のその位置にある 1 文字に一致することになります。Stuff in[]はクラスであり、複数の種類の文字に一致できますが、最後に一致した位置の次の位置にある文字のみに一致します。[.-] 電話番号の数字以外の文字を識別するのに役立つ場合があります。文字クラスで範囲を表現することもできます[a-hA-H][4-9]

ただし、フォローアップ文字を使用し始めると、一度に 1 つの str 位置がウィンドウから外れます。

? - one or none
* - 0 or many
+ - 1 or more

.ワイルドカード文字は避けてください。非効率的です。なんらかの理由で、効率のためにアセンブリでの実装までずっと下がっていると思われます.1〜2個のテレタイプの空白文字ではなく、すべての可能性をチェックします. . さらに重要なことは、パフォーマンスの優れた代替手段がはるかに強力で役立つことです。文字クラスの否定ははるかに高速です。[^<]*< 文字ではないものの 0 個以上の位置を表します。

技術的に「通常の」言語に限定されなくなった regEx で完全に実行可能である XML/SGML スタイルの構文解析のための非常に便利なものです。他の誰かの HTML と同じくらいだらしないことを許容するもので、自分が何を見ているかを認識しておく必要がありますが、それは私の本では単なる「当たり前」です。

Crockford 氏は、JSlint で文字クラスを否定しないように警告しています。クロックフォードは、その点で痛々しいほど間違っています。それらははるかに効率的であるだけでなく、物事をトークン化する方法を考えるのもはるかに簡単になります. {}セキュリティ上のリスクがある場合は、角かっこに一致する文字数に明示的な制限を設定できます。たとえば、 p{2,5}2 ~ 5 個の p 文字に一致するか{5}、正確に 5 個{,5}、最大 5 個、または{5,}少なくとも 5 個に一致します (最後の文字列をテストすると思います)。 2)

あなたが調べるべき他のランダムなもの:

(ph|f)- ph または f - 魚や魚を見つけるのに役立ちます (基本的に、クラスが役に立たない場合)

^- 文字列の始まりを表します - 文字そのものよりも、次の文字の条件と考えてください。はい、文字クラスも否定します。

$- 文字列の終わりを表します - 上記と同じ注意事項ですが、前の文字についてです。

\- 特殊記号をエスケープするために使用されます。注: 文字クラスで意味を持たない多くの特殊記号は\内部を必要としません[]

\s\w\d- これらは、一般的に使用される文字セットを表します。最初はほぼすべての空白 (js スタイルのエスケープには、通常、正規表現に相当するものがあります) であり、その後に単語文字 (クラス相当[a-zA-Z0-9_]) の w と数字の d が続きます[0-9]。正反対の場合は、これらのいずれかを大文字にします。

後方参照や先読みなど、知っておく価値のあるユースケースのシナリオは他にもありますが、これは私が通常の経験から実際に覚えている一般的に使用されるものです (bwaahaahaa)。

AZの懸念があるため、米国以外を探していると思います。米国の電話番号の正規表現がたくさんあると確信していますが、おそらく米国の番号に対して次のようにします。

/\(?\d{3}[)\-. ]?\d{3}[\-. ]?\d{4}/

一致する: 123-456-7890

(123)456-7890

123.456.7890

123 456 7890

1234567890

しかし、おそらく乱雑に許可します:

(123456.7890

...複雑さを避けるために、私は喜んでそれを受け入れます。すべてを 1 つの表現で行いたいという誘惑に抵抗してください。たとえば、末尾/先頭の空白を削除してから、式で何かをヒットする方がはるかにクリーンな場合があります。Split メソッドと Join メソッドはトークン化に非常に強力です

これが通常の正規表現の会話のように進行する場合、誰かが私のパターンで見逃していたことをすぐに指摘するでしょう。そうそう、いろいろ試してみてください。表現を設定してから、文字を差し込んでそれらを壊そうとするサイトがあります.

于 2012-12-13T05:29:52.537 に答える