9

js*.jsでなどのシェルワイルドカードを使ってタイトルを検索したいです。*.*.*問題は、タイトルのリストをループして、js 正規表現テストを使用してファイルをフィルタリングする必要があることです。シェルのワイルドカードを適切な方法で正規表現に変換するにはどうすればよいですか、または既にそれを行っているライブラリはありますか?

注: シェルのワイルドカードから正規表現への汎用コンバーターが必要です。

4

3 に答える 3

18

汎用コンバーター関数が必要な場合は、次のように動作するはずです。

function globStringToRegex(str) {
    return new RegExp(preg_quote(str).replace(/\\\*/g, '.*').replace(/\\\?/g, '.'), 'g');
}
function preg_quote (str, delimiter) {
    // http://kevin.vanzonneveld.net
    // +   original by: booeyOH
    // +   improved by: Ates Goral (http://magnetiq.com)
    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +   bugfixed by: Onno Marsman
    // +   improved by: Brett Zamir (http://brett-zamir.me)
    // *     example 1: preg_quote("$40");
    // *     returns 1: '\$40'
    // *     example 2: preg_quote("*RRRING* Hello?");
    // *     returns 2: '\*RRRING\* Hello\?'
    // *     example 3: preg_quote("\\.+*?[^]$(){}=!<>|:");
    // *     returns 3: '\\\.\+\*\?\[\^\]\$\(\)\{\}\=\!\<\>\|\:'
    return (str + '').replace(new RegExp('[.\\\\+*?\\[\\^\\]$(){}=!<>|:\\' + (delimiter || '') + '-]', 'g'), '\\$&');
}

(ここからの preg_quote 関数: http://phpjs.org/functions/preg_quote/ )。

使用する:

var realRegex = globStringToRegex("2012-*-*.js"); //returns a RegExp object of /2012\-.*\-.*\.js/g

これが動作するJSフィドルです:

http://jsfiddle.net/d5sdw/2/

次に、RegExp オブジェクトを使用して一致させることができます。

if (yourString.match(realRegex)) { //do something

更新?:単一のワイルドカード文字をサポートします。

基本的に、これは文字列全体を非正規表現に変換し、*が にマップされ.*?にマップされることを確認するだけ.です。これらは同等であるためです。

于 2012-12-11T10:51:33.127 に答える
1

これはかなり近いはずです。

yourVar.match(/.*\.js$/i)

意味

  • 文字列の先頭は任意の文字列です.*
  • 続い.jsて最後に\.js$
  • この大文字と小文字を区別しない/i
于 2012-12-11T10:45:25.267 に答える
0

ブール値の結果を取得するために regexp を使用した場合 (一致結果が必要ない場合)、testメソッドを使用することをお勧めします。

/.*\.js$/i.test(yourVar)

于 2012-12-11T10:52:01.713 に答える