0

これは私の正規表現です:

"^[^\.]([\w-\!\#\$\%\&\'\*\+\-\/\=\`\{\|\}\~\?\^]+)([\.]{0,1})([\w-\!\#\$\%\&\'\*\+\-\/\=\`\{\|\}\~\?\^]+)[^\.]@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([\w-]+\.)+))([a-zA-Z]{2,6}|[0-9]{1,3})(\]?)$"

255 文字未満の文字列のみを照合する必要があります。

RegEx の先頭に単語境界を追加しようとしましたが、失敗します:

"^(?=.{1,254})[^\.]([\w-\!\#\$\%\&\'\*\+\-\/\=\`\{\|\}\~\?\^]+)([\.]{0,1})([\w-\!\#\$\%\&\'\*\+\-\/\=\`\{\|\}\~\?\^]+)[^\.]@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([\w-]+\.)+))([a-zA-Z]{2,6}|[0-9]{1,3})(\]?)$"
4

3 に答える 3

3

254 までであることを確認するには、先読みに $ が必要です。そうしないと、254 を超える場合でも先読みが一致します。

(?=.{1,254}$)

また、文字クラス (角かっこ) では、通常はエスケープする必要がある多くの文字をエスケープする必要がないため、正規表現を大幅に簡素化できることに注意してください。

"[\w-\!\#\$\%\&\'\*\+\-\/\=\`\{\|\}\~\?\^]"

これと同じです:

"[-\w!#$%&'*+/=`{|}~?^]"

リテラル ダッシュであるためには、文字クラスの最初にダッシュを配置する必要があり、キャレットを最初に配置してはならないことに注意してください。

いくつかの単純化を行った完全な文字列は次のとおりです。

"^(?=.{1,254}$)[-\w!#$%&'*+/=`{|}~?^]+(\.[-\w!#$%&'*+/=`{|}~?^]+)*@((\d{1,3}\.){3}\d{1,3}|([-\w]+\.)+[a-zA-Z]{2,6})$"

ノート:

  • 最初の文字がピリオドであってはならないという規定 ([^.]) を削除しました。これは、次の文字クラスがいずれにしてもピリオドと一致しないためです。冗長です。
  • 多くの不要な括弧を削除しました
  • [0-9] を \d に置き換えました
  • {0,1} を省略形の「?」に置き換えました。
  • @マークのあとはIPアドレスかテキストドメイン名を合わせようとしているようだったので、組み合わせにならないようにさらに区切った
  • 最後のオプションの角括弧が何のためにあるのかわからないので、それを削除しました: "(]?)"

Regex Hero で試してみましたが、うまくいきました。それがあなたのために働くかどうか見てください。

于 2013-05-01T16:03:34.820 に答える
2

これは、作業している言語によって異なります。たとえば、Python では、正規表現を使用してテキストを個別の文字列に分割し、len() を使用して必要な 255 文字より長い文字列を削除できます。

于 2013-05-01T16:03:44.290 に答える
1

この投稿が役立つと思います。特定のパターンを制限する方法を示していますが、正規表現全体にどのように追加するかはわかりません。

于 2013-05-01T16:05:27.887 に答える