2013-02-13 10 views
11

なしで表現する簡潔な方法はありますwは\を表現する方法ドメイン名の検証を表現する最も簡潔な方法を探しているからです。ドメイン名には、小文字と大文字、数字、ピリオド、ダッシュが含まれますが、アンダースコアは含まれません。 \ wには上記のすべてとアンダースコアが含まれます。では、正規表現の構文を使って\ wからアンダースコアを "削除"する方法はありますか?正規表現:</p>ある <pre><code>w but without _ </code></pre> <p>は、私が求めている</p> <p>「すべての文字がwはに含ま_除いて、」:アンダースコア

最終更新:私はPHPで使われているregexについて尋ねています。

ありがとうございます!通常、我々は文字クラスを使用しますが、安全のために

+2

正規表現の味に依存します。どの言語を使用していますか?最も簡単な方法は '[A-Za-z0-9]'を使うことです。 '\ w'は(通常)**ではなく、ダッシュやピリオドを含みます。 –

+1

風味に応じて、 '\ w'はUnicode文字をサポートするかもしれません。 '\ w'が何を表しているかを完全に確かめていない限り、文字クラス' [] 'を使用して、それらをすべて正常にリストするのが最善です。 – nhahtdh

答えて

20

次の文字クラスは、あなたがこのような何かを書くことができます​​

+1

良い考えですが、あなたの原子が正しくありません。 – Bergi

+0

どうすればいいのかを教えてください。 '?:'部分は、原子が見つけたグループを実際に捕捉しないと言っているだけです。 – protist

+1

@protist:原子は誤っています。 '\ w'は' _'にマッチし、 '|'はオルタネーションであり、ORのように振る舞います。 – nhahtdh

3

[a-zA-Z0-9.-] 

一致英語のアルファベット上記の正規表現「断片」、および数字、プラス期間.とダッシュ-。それは、最も基本的な正規表現サポートでも機能するはずです。

より短いかもしれませんが、その表現が正確に分かっている場合に限ります。

使用している言語がわかりません。多くのエンジンでは、\w[a-zA-Z0-9_]と同等です(これには「ASCIIモード」が必要なものもあります)。ただし、一部のエンジンで正規表現のUnicodeサポートがあり、Unicode文字に一致するように\wを拡張することがあります。

+0

これは、 "äö"などのすべてのユニコード文字を除外します。 – MrD

+0

@MrD:うん、最高の方法は正規表現を使ってドメインの検証を全く行わないことです。 – nhahtdh

1

は、いくつかの正規表現のフレーバーは、あなたが使用する可能性のある負の後読みの構文を持っています

\w(?<!_) 
+2

負の先読みよりも負の先読みが広くサポートされています。 –

+1

@JosephSilber True概念的には、「私に単語のキャラクタを与えるが、アンダースコアではない」というのは、「次のものがアンダースコアではない...そうでなければ、しかし、*利用可能です。 –

4

あなたはnegative lookaheadを使用することができます。(?!_)\w

しかし、私は[a-zA-Z0-9.-]を書くことは、より読みやすいと思います。

+1

それは '(?!_)\ w'でしょうか? –

+0

修正ありがとうございました – Bergi

+0

ルックアラウンドは通常のマッチングよりも遅いです。ここで問題ないかもしれませんが、 – nhahtdh

2

私の理解が正しい場合\wを意味する[A-Za-z0-9_]期間記号、ダッシュは含まれません。

情報: http://en.wikipedia.org/wiki/Regular_expression#POSIX_character_classes

ので、私はあなたが何をしたいと思い、私は[^ _]で始まり、その後、文字は私が拒否する必要がある他に何を思うだろう[a-zA-Z0-9.-]

+1

英語以外の文字がある場合、この問題が発生します。 –

+0

@ZoltánTamási**ドメイン名**、英語以外の文字? – Kent

+0

@Kent - [ICANNは非ラテンドメイン名を承認する](http://news.cnet.com/8301-1023_3-10387139-93.html)。 –

1

です。キーボード入力をフィルタリングする必要がある場合は、不要な文字をすべて列挙するのは簡単です。あなたはこの文字列でpreg_filterを使用する場合は

\([^\w]|_)\u 

[^\W_] 

\W(Perlで)

+1

これは非常に貧弱なアプローチです。ドメイン名には許可された文字セットが定義されているため、ホワイトリストを作成できます。あなたがブラックリストを作成するときには、あなたが拒否する必要があるUnicode文字を気にする必要があります。 – nhahtdh

+0

@nhahtdh、私はdoamin名にユニコード文字(アクセント付き母音など)を付けることができると考えました。だから、究極の正しいホワイトリストソリューションを正確に形成することは非常に難しいと思います。 –

+0

それにはスペックがあります - それは面倒ですが、定義されています。ブラックリストに登録すると、人々は忘れたり、見落としたりする傾向があります。 – nhahtdh

0

と同じです\ w(アンダースコアを除く)の文字はフィルタリングされます。

関連する問題

 関連する問題