1

何かを含むことができる文字列内の有効なRFC1123ホスト名である可能性があるものに一致する正規表現を探しています。アイデアは、ホスト名である可能性のあるすべてのものを抽出することです(サブストリングがすべての要件に従って1つになることを確認することによって)-後で結果を簡単に確認できる最大長の255文字を除きます。

私は最初に思いついた:

/(^|[^a-z0-9-])([a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?(\.[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?)*)([^a-z0-9-]|$)/i

これは、括弧で囲まれた式2の一部のホスト名と一致しますが(意図したとおり)、他のホスト名をスキップしているようです。スタックオーバーフローの問題を調べて、私はこの関連する質問を見つけました:

DNSホスト名またはIPアドレスに一致する正規表現?

正のフィードバックから判断すると、答えは正しいはずです(ラベルのサイズは確認されませんが)ので、試してみようと思いました。それらの式を、前の式と同様の抽出可能な形式に変換しました。

/(^|[^a-z0-9-])((([a-z0-9]|[a-z0-9][a-z0-9-]*[a-z0-9])\.)*([a-z0-9]|[a-z0-9][a-z0-9-]*[a-z0-9]))([^a-z0-9-]|$)/i

繰り返しますが、括弧で囲まれた式2で目的の結果を返す必要がありますが、いくつかの有効な部分文字列をスキップしているように見えます。ホスト名の一部ではない区切り文字をチェックする方法に問題がある可能性があると思います。

何か案は?

4

1 に答える 1

1

理解した。文字列をスキャンして順次一致する場合、目的の式の前後に区切り文字を使用すると、ホスト名の各ペア間で 2 文字を消費する必要があります。そのため、ホスト名が 1 文字しか離れていない場合、2 番目の文字はスキップされます!

正しい結果を得るには、先頭の区切り文字を削除するだけです。

/([a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?(\.[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?)*)([^a-z0-9-]|$)/i

スキャンではなく検証にのみ必要です。

于 2013-03-20T13:47:05.070 に答える