0

ドメイン名を検証するために正規表現を使用しています (ここでの私の質問は、正規表現が適切かどうかを判断することではありません!)。

私が使用している正規表現は次のとおりです: ^(?:[a-zA-Z0-9]+(?:-*[a-zA-Z0-9])*.)+[a-zA-Z]{2 ,6}$

C# バックエンドでこの正規表現を使用すると、ドメイン名 org.comabcd に無効のフラグが付けられます (ドメイン名拡張子に 7 文字があるため)。だからこれは素晴らしいです!

この正規表現をオンラインの JavaScript 正規表現バリデーター ( http://regexpal.com/ ) で使用すると、同じ動作が見つかりました。これがまたスゴイ!!

しかし、私の UI フロントエンドは、カスタム DataAnnotationsModelValidator の Knockout JS カスタム検証でこの正規表現を使用し、ドメイン名は有効としてフラグが立てられます。

私が使用しているコードは次のとおりです。

ko.validation.rules["domainname"] = {
    validator: (val: any, validate: boolean) => {
         var regex = new RegExp("^(?:[a-zA-Z0-9]+(?:\-*[a-zA-Z0-9])*\.)+[a-zA-Z]{2,6}$");
        return regex.test(val);
    },
message: Localization.validation_domain_name_invalid_format
};

ドメイン名拡張子に数字を含めようとすると、無効として正しくフラグが立てられるため、バリデーターが「少し」機能することはわかっています。

何が起こっているのか、正規表現が正しく使用されていないように見えるのはなぜですか?

4

1 に答える 1

1

コンパイル時に正規表現として使用しているものを知っていて、その場で構築しない場合は、正規表現リテラルを使用する必要があります。

var regex = /^(?:[a-zA-Z0-9]+(?:\-*[a-zA-Z0-9])*\.)+[a-zA-Z]{2,6}$/

リテラルはスクリプトの読み込み時にコンパイルされますが、RegExp は実行時に変更できるため、パフォーマンスがわずかに遅くなります。

正しく動作しない理由については、おそらく文字列を適切にエスケープしていないことが原因です。正規表現を RegExp の文字列として使用する場合、バックスラッシュをエスケープする必要があるため、式を に変更すると機能する^(?:[a-zA-Z0-9]+(?:\\-*[a-zA-Z0-9])*\\.)+[a-zA-Z]{2,6}$はずです。

于 2013-10-22T07:34:46.413 に答える