2

次のようなURLに一致するように生成された長い正規表現があります

/^\/([^\/.?]+)(?:\/([^\/.?]+)(?:\/([^\/.?]+)(?:\.([^\/.?]+))?)?)?$/

一致します:

/foo/bar/1.html

なので['foo', 'bar', '1', 'html']

Javascript では、ユーザーが URL を入力するときに一致する部分を取得したいと思います (typeahead のように)。たとえば、次のように入力したとします。

/foo

一致したこと/fooがわかりますが、正規表現全体が満たされていません。Rubyは、次のような一致する部分要素のみを含む配列を返すことができます:['foo', nil, nil, nil]これは可能ですか、またはJavascriptで簡単に実行できますか?

4

1 に答える 1

2

@minitech は基本的に答えの半分を与えました。?各グループの後に使用すると、正規表現が欠落していても一致させることができます。それができたら、正規表現結果のグループをチェックして、一致したビットと一致していないビットを確認します。

例えば:

/^\/([^\/.?]+)?(?:\/([^\/.?]+)?(?:\/([^\/.?]+)?(?:\.([^\/.?]+))?)?)?$/.exec('/ab/c')

戻ります:

["/ab:c", "ab:c", "c", undefined, undefined]

返された 4 番目の値が未定義であることを確認することで、どのチャンクが入力されたか、または入力されなかったかを把握できます。

余談ですが、このような正規表現を大量に使用する場合は、どのグループがどれであるかを追跡しようとするだけで、簡単に正気を失う可能性があります。このため、「名前付きグループ」の正規表現を使用することを強くお勧めします。これらは、XRegxp ライブラリ (http://xregexp.com/) を使用する場合に作成できる通常の正規表現です。

var result = XRegExp.exec('/ab/c', /^\/(?<fooPart>[^\/.?]+)?(?<barPart>?:\/([^\/.?]+)?(?:\/([^\/.?]+)?(?:\.([^\/.?]+))?)?)?$/)
var fooPart = result.fooPart

そのライブラリには、同様に正規表現を制御するのに役立つコメントなどの便利な機能もあります。この 1 つの正規表現しか使用していない場合は、おそらくやり過ぎですが、多くの JS regexp 作業を行っている場合は、そのライブラリを十分にお勧めできません。

于 2012-12-26T23:46:50.807 に答える