2012-12-11 19 views
9

Desidero cercare i titoli utilizzando i caratteri jolly shell come *.js, *.*.* ecc. In js. Il fatto è che faccio scorrere un elenco di titoli e ho bisogno di filtrare i file usando un test js regex. Come faccio a convertire i caratteri jolly della shell in espressioni regolari o ci sono librerie che lo fanno già?Conversione di caratteri jolly shell per regex

Nota: voglio un convertitore generico dai caratteri jolly shell per regex.

+0

Normalmente '*' è più o meno equivalente a '/.*/' e '.' soggiorni' '/./ – Christoph

+0

No,' * 'è una abbreviazione di' {0,} 'a regex. – einstein

+0

Dovresti leggere più a fondo ... la domanda riguardava i caratteri jolly in una ricerca. Per esempio. '* .js' sarebbe' /.* \. js/'-' * 'converte in' /.*/ 'qui. – Christoph

risposta

1

Questo dovrebbe essere abbastanza vicino.

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

significa

  • inizio della stringa è una qualsiasi sequenza di caratteri .*
  • seguita dalla .js alla fine \.js$
  • fare questo case insensitive /i
+0

non scriverei '\ .js $' poiché non corrisponderà se c'è accidentalmente uno spazio bianco dopo l'estensione del file. – Christoph

13

Se si desidera un convertitore generico la funzione, questo dovrebbe funzionare:

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'), '\\$&'); 
} 

(funzione funzione preg_quote da qui: http://phpjs.org/functions/preg_quote/).

Usa:

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

Ecco un violino JS di farlo funzionare:

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

è possibile utilizzare l'oggetto RegExp per abbinare:

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

Aggiornamento : Supporta ? per singolo carattere jolly.

In pratica tutto questo non fa altro che convertire l'intera stringa non regex, e poi fa in modo che * viene mappato su .* e ? viene mappato su ., come sono l'equivalente.

+0

C'è ancora il carattere '?' Da sostituire. – Kos

+0

@Kos Hai ragione - aggiornato. – h2ooooooo

+1

lodash ha una funzione escapeRegExp che puoi usare al posto di preg_quote se stai già usando quella lib. https://lodash.com/docs/4.17.4#escapeRegExp –

0

se regexp utilizzato per ottenere il risultato booleano (quando non è necessario un risultato della corrispondenza), è meglio utilizzare il metodo test.

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

Problemi correlati