0

この正規表現を使用して、ユーザーがドメイン名を入力するときにプロトコルが含まれているかどうかを検出しています。

if (/^[^http:\/\/|www.][a-zA-Z0-9\-]+\.(co\.uk|com|net|biz|org|org\.uk|eu|me\.uk)$/i.test(inp2){
  ... ok ...
}

97% の確率で動作し、一部の名前が失敗した理由に気付きました。プロトコル全体と一致せず、単語全体として扱うのではなく、文字 h、t、t、p または w、w、w を含むものと一致します。 http://:' または 'www.'

次でテストしたときにわかりました:

**hattooflat.com**

これは合格する必要がありますが、文字h、t、tが失敗しています

単語の境界 \b が必要だと思いますが、どこにあるのかわかりません:

(/^\b[^http:\/\/|www.]\b[a-zA-Z0-9\-]+\.( .....

また

(/^[^\bhttp:\b\/\/|\bwww\b.][a-zA-Z0-9\-]+\.( .....

私は近いことを知っています-正規表現は、4年間の開発後もまだ私に悲しみを与えています

4

3 に答える 3

4

実際には、先読みが必要です:

/^(?!https?:\/\/|www\.)[a-zA-Z0-9\-]+\.(co\.uk|com|net|biz|org|org\.uk|eu|me\.uk)$/i

この短いデモも参照してください。


簡単な説明:

  • ^: 文字列の先頭に一致します (1 行の入力を想定)。

  • (?!<...>):文字を消費しませんが、先読みして、文字列の次の部分が一致しない<...>ことを確認します(否定先読み)。

  • https?:\/\/|www\.http://:またはhttps://またはwww.( ?'s' の後は「オプション」になります) のいずれかに一致します。

  • [a-zA-Z0-9\-]+: 1 つ以上の英数字または「-」を含む任意のシーケンスに一致します。

  • \.: 1 つのドット ('.') に一致します。

  • (co\.uk|com|net|biz|org|org\.uk|eu|me\.uk)co.uk:またはcomまたはnetまたは ...のいずれかに一致

  • $: 文字列の末尾に一致します (1 行の入力を想定)。

于 2013-06-20T09:33:58.967 に答える
0

プロトコルとサブドメインなしでドメイン名を識別したいだけなら、次の正規表現を使用しないでください:

^([a-zA-Z0-9]{2}|([a-zA-Z0-9][a-zA-Z0-9\-])+[a-z0-9])\.(co\.uk|com|net|biz|org|org\.uk|eu|me\.uk)$

正規表現では、長さ 2 のドメイン名と、非連続 (非末尾、非先頭) ハイフンを含む長さ 3 のドメイン名が許可されます。

于 2013-06-20T09:41:59.673 に答える