2012-12-11 14 views
9

Chcę wyszukać tytuły za pomocą symboli wieloznacznych powłoki, takich jak *.js, *.*.* itd. W js. Chodzi o to, że przeglądam listę tytułów i muszę filtrować pliki za pomocą testu js regex. W jaki sposób mogę przekonwertować symbole wieloznaczne powłoki, aby dobrze je wypakować, czy istnieją jakieś biblioteki, które już to robią?Konwertowanie symboli wieloznacznych powłoki w celu ponownego wyodrębnienia

Uwaga: Chcę użyć standardowego konwertera z symboli wieloznacznych powłoki, aby wyodrębnić.

+0

Normalnie '*' jest prawie równoważna '/.*/' i '.' pozostaje' ' – Christoph

+0

/./ Nie,' * 'to skrót od '{0} w' regex. – einstein

+0

Powinieneś przeczytać dokładniej ... pytanie dotyczyło symboli wieloznacznych podczas wyszukiwania. Na przykład. '* .js' będzie' /.* \. js/'-' * 'konwertuje do' /.*/ 'tutaj. – Christoph

Odpowiedz

1

To powinno być całkiem blisko.

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

oznacza

  • początek łańcucha jest dowolny ciąg znaków .*
  • następnie .js w końcu \.js$
  • zrobić ten przypadek niewrażliwe /i
+0

Nie zapisałbym '\ .js $', ponieważ nie będzie się zgadzać, jeśli przypadkowo pojawi się biały znak po rozszerzeniu pliku. – Christoph

13

Jeśli chcesz ogólny konwerter funkcja, to powinno działać:

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

(funkcja preg_quote stąd: http://phpjs.org/functions/preg_quote/).

Zastosowanie:

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

Oto JS skrzypce z nim pracować:

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

Następnie można użyć obiektu RegExp dopasować:

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

Aktualizacja : Obsługuje ? dla pojedynczego symbolu wieloznacznego.

zasadzie wszystko to robi to przekonwertować cały ciąg nie regex, a następnie zapewnia, że ​​* zostaje odwzorowany na .* i ? zostaje odwzorowany na ., jak są one równoważne.

+0

Nadal istnieje znak '?' Do zastąpienia. – Kos

+0

@Kos Masz rację - zaktualizowano. – h2ooooooo

+1

lodash ma funkcję escapeRegExp, której możesz użyć zamiast preg_quote, jeśli już używasz tej biblioteki. https://lodash.com/docs/4.17.4#escapeRegExp –

0

jeśli wyrażenie regexp użyte do uzyskania wyniku boolowskiego (gdy nie potrzebujesz wyniku dopasowania), lepiej użyć metody test.

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

Powiązane problemy