0

つまり、代わりに

/^[asdfjkl;]foo[asdfjkl;]bar[asdfjkl;]baz$/i

あるいは

RegExp('^[[:HOMEROW:]]foo[[:HOMEROW:]]bar[[:HOMEROW:]]baz$'.replace(/\[:HOMEROW:]/g, 'asdfjkl;'))

私はただ書くことができるかもしれません:

/\H=[asdfjkl;];^\Hfoo\Hbar\Hbaz$/

誰もこれをどのように考えていませんか、そして彼らが考えていると仮定すると、なぜそれはより多くのサポートや実装を享受しないのですか?

注:私はこれの哲学的側面にもっと興味があります:機能を除外する理由は何ですか?

4

2 に答える 2

2

RegExp のラッパー オブジェクトを作成できます。

myRegExp = function(regex,mods) {
    var customclasses = {
        nonDotLocalChar:'A-Za-z0-9!#$%&\'*+-/=?^_`{|}~'
    }, i;
    for( i in customclasses) {
        regex = regex.replace(new RegExp("\[:(\^?)"+i+":\]","i"),"$1"+customclasses[i]);
    }
    return new RegExp(regex,mods);
};

その後、上記を次のように使用できます。

var eam = new myRegExp("^[[:nondotlocalchar:]](?(?:[[:nondotlocalchar:]].........");

次のように使用することもできます。

new myRegExp("[[:^nondotlocalchar:]]"); // negates the custom class
new myRegExp("[@[:nondotlocalchar:]]"); // allow anything from the custom class, or the @ character
于 2012-10-07T09:59:45.917 に答える
1

あなたは哲学的な質問をしているので (SO のようなサイトにとってはあまり良い質問ではありません)、かなり推測に基づく回答をさせてください。結局のところ、私は言語設計者を代弁することはできませんが、次のように推測できます。

通常、正規表現がこれほどひどいものになると、それは正規表現がその仕事に適したツールではないという確かな兆候です。そのため、ある意味では、カスタム文字クラスは不適切なプログラミング (電子メール アドレスを正規表現で検証しようとするなど) を助長することになります。それが、正規表現標準を定義するほど賢い人が誰もこの機能を実装することを選択しなかった理由だと思います。

たとえば、電子メール アドレスを見つけることが目的の場合は、次のような基本的な正規表現を使用して非常に初歩的なスキャンを実行するのがおそらく最善です。

\S+@\S+\.\S+

次に、専用の電子メール アドレス パーサーを使用して結果を確認し、不一致を取り除きます。

より良い例は、日付の検証です。

正規表現を使用して MM/DD/YYYY の日付を検証できます

^(?:(?:(?:(?:(?:0?[13578]|1[02])\/31)|(?:(?:0?[13-9]|1[0-2])\/(?:29|30)))\/(?:1[6-9]|[2-9]\d)\d{2})|(?:0?2\/29\/(?:(?:(?:1[6-9]|[2-9]\d)(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00))))|(?:(?:0?[1-9])|(?:1[0-2]))\/(?:0?[1-9]|1\d|2[0-8])\/(?:(?:1[6-9]|[2-9]\d)\d{2}))$

しかし、おそらく次のような正規表現を使用する必要があります

^\d\d/\d\d/\d\d\d\d$

日付パーサーを使用して、2 番目のステップで有効な日付を見つけます。

于 2012-10-07T10:12:09.573 に答える