私はjsコードを持っています:</p>
/^([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+@([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+\.[a-zA-Z]{2,3}$/
しかし、?(js 正規表現)の意味は[_|\_|\.]
何ですか</p>
私はjsコードを持っています:</p>
/^([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+@([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+\.[a-zA-Z]{2,3}$/
しかし、?(js 正規表現)の意味は[_|\_|\.]
何ですか</p>
Regexperのようなリソースを使用すると、この正規表現を視覚化できます。
[_|\_|\.]
このことから、「_」、「|」のいずれかが必要であると結論付けることができます。また "。"。また、"_" と "|" の二重宣言が行われていることもわかります。不要です。HamZa がコメントしたように、このセグメントを短縮し[_|.]
て同じ結果を得ることができます。
実際、Regexper などのリソースを使用して式全体を視覚化することもできます。
パイプ文字、アンダースコア、またはピリオドに一致します。
しかし、それは不必要に複雑です。もっと簡単かもしれません。
これに短縮できます
[|_.]
[_|\_|\.]
_
はおそらくアンダースコア ( ) またはピリオド ( )に一致するように意図.
されており、 のように書かれているはずです[_.]
。
私は、著者がパイプ ( |
) を使用して「または」(つまり、代替) を意味していると確信していますが、これは文字クラス内では必要ありません。他のレスポンダーが言ったように、パイプは実際には文字通りのパイプと一致しますが、それが作者の意図ではないと思います。初心者にありがちなミスです。
ドット ( .
) は、文字クラスに現れるとその特別な意味を失うもう 1 つの特殊文字です。害はありませんが、著者のようにバックスラッシュでエスケープする必要はありません。また、アンダースコアには特別な意味はありません。なぜ著者がそれを 2 回 (バックスラッシュありとバックスラッシュなし) 記載したのか、私は推測しようとしません。
あなたはそれについて尋ねませんでしたが、?
そこにも属していません。Kobi が指摘したように、それが正規表現を非常に非効率的なものにしているのです。アイデアは、1 つまたは複数の英数字に一致し、オプションで区切り文字 (ドットまたはアンダースコア) に一致し、その後にいくつかの英数字が続き、必要に応じて繰り返す必要があるというものでした。これが私がそれを書く方法です:
[a-zA-Z0-9]+([_.][a-zA-Z0-9]+)*
英数字がなくなり、次の文字が_
または.
でない場合、そのセクション全体をスキップして、次の部分との一致を試みます。そして、それができない場合は、一致する可能性がないため、すぐに救済できます。しかし、あなたの正規表現の書き方では、セパレーターは、それが分離するはずのものとは無関係にオプションであるため、役に立たなくなります。正規表現エンジンは、あきらめる前に、エンドレスで無意味な組み合わせで既に消費した文字を一致させようとして、バックアップを続ける必要があります。残念ながら、これもよくある間違いです。