Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: RegExp /g
Forum PHP.pl > Forum > Po stronie przeglądarki > JavaScript
flashdev
Do tej pory pisałem wyrażenia regularnie głównie w PHP i Ruby. W tej chwili zetknąłem się z problemem w js, ponieważ tutaj działa to troszkę inaczej.

Kod
var txt = ' 123 a127a b23b a4a';
var res = txt.match(/a([0-9]+)a/g);
for( var i in res ){
alert(i + ' = ' + res[i]);
}

http://js.blop.pl/index.php?dmFyIHR4dCA9IC...mVzW2ldKTsNCn0=

Chciałbym uzyskać tablicę samych cyfr [127, 4] bez otaczających ich znakó, które z kolei są konieczne do dopasowania wyrażenia.

Usunięcie modyfikatora 'g' zwraca odpowiednią tablicę, ale tylko dla pierwszego dopasowania zamiast wszystkich jak to się dzieje w PHP.
shpyo
Zawsze można tak:
Kod
var m = ' 123 a127a b23b a4a'.match(/(a(\d+)a)/g),
   d = [];

for( i=0, ml = m.length; i<ml; i++ )
   d.push( m[i].match(/\d+/)[0] );
flashdev
Właśnie chciałbym uniknąć pętli. Szukanych elementów może być bardzo dużo, a to jest tylko język skryptowy.
Da się jakoś normalnie? Tak jak w PHP? Jeden preg = tablica wszystkich fragmentów pasujących do podwyrażenia ujętego w nawiasach.
kamil4u
Nienawidzę tych przeklętych, głupich wyrażeń... grrr...
Po 10min walki masz:
Kod
<script>
var txt = ' 123 a127a b23b a4a';
var res = txt.match(/(?!a)[0-9]+(?=a)/g);
alert(res);
</script>


Polecam: http://www.egrafik.pl/kurs-regex-wyrazenia-regularne/
flashdev
Cytat(kamil4u @ 7.01.2011, 21:39:39 ) *
Nienawidzę tych przeklętych, głupich wyrażeń... grrr...
Po 10min walki masz:
Kod
<script>
var txt = ' 123 a127a b23b a4a';
var res = txt.match(/(?!a)[0-9]+(?=a)/g);
alert(res);
</script>


Polecam: http://www.egrafik.pl/kurs-regex-wyrazenia-regularne/


Dzięki za starania, ale to nie do końca to.
Ciąg ' 123 a127a b23b a4a' również pasuje do wzorca, a nie powinien.
kamil4u
Nie rozumiem.... Co chcesz pobrać tego ciągu? Podaj też inny przykład ciągu. Obecnie pobiera wszystko to co jest liczbą pomiędzy "a" i "a", czyli tak jak jest w Twoim przykładzie.

Cytat
Chciałbym uzyskać tablicę samych cyfr [127, 4]
Skrypt zwraca takową tablicę. Opisz trochę dokładniej to może będziemy walczyć dalej smile.gif
flashdev
Cytat(kamil4u @ 7.01.2011, 22:38:24 ) *
Nie rozumiem.... Co chcesz pobrać tego ciągu? Podaj też inny przykład ciągu. Obecnie pobiera wszystko to co jest liczbą pomiędzy "a" i "a", czyli tak jak jest w Twoim przykładzie.

Skrypt zwraca takową tablicę. Opisz trochę dokładniej to może będziemy walczyć dalej smile.gif


Rzeczywiście troszkę niedokładnie opisałem.
To powyżej to był przykład, a chodziło raczej o coś takiego:
Kod
var tak = 'abcd  a123z (nawias)';
var nie = '123abc';
var res = (tak+' ' +nie).match(/([^a-z0-9]|^)([a-z][a-z0-9]*)([^a-z0-9]|$)/gim);
for( var i in res ){
alert(i + ' = _' + res[i] + '_');
}


Wyrażenie ma wyciągać kawałki ciągu które są otoczone przez znaki nie pasujące do danego wzorca.
Problem w tym, że nie chciałbym znaków otaczających podciąg. Wiem że mogę je usunąć przy pomocy substring, ale to wymaga użycia pętli, a to co mnie interesuje to jedno eleganckie wyrażenie załatwiające problem.
W tej chwili zauważyłem jeszcze jeden problem tego wyrażenia. Problem pojawia się jeśli jest tylko jeden znak separujący szukane podciągi.
kamil4u
Nadal nie rozumiem... opisz dokładniej, jakie masz dane wejściowe i co chcesz wyciągnąć z danego ciągu. Tworzysz jakieś zmienne tak, nie, jakieś nawiasy bez żadnego opisu czy czegokolwiek. Albo napisz co chcesz naprawdę osiągnąć jak to nie jest tajemnica smile.gif
flashdev
Cytat(kamil4u @ 7.01.2011, 23:13:23 ) *
Nadal nie rozumiem... opisz dokładniej, jakie masz dane wejściowe i co chcesz wyciągnąć z danego ciągu. Tworzysz jakieś zmienne tak, nie, jakieś nawiasy bez żadnego opisu czy czegokolwiek. Albo napisz co chcesz naprawdę osiągnąć jak to nie jest tajemnica smile.gif


Po prostu to co umieściłem powyżej można uznać za to co chcę osiągnąć. Z tym że w wynikach nie chcę otaczajacych pojedyńczych znaków.
Tymczasowo rozwiązałem to usuwając je w pętli kolejnym wyrażeniem regularnym.
Dodatkowo chciałbym pozbyć się problemu pojedyńczych znaków separujących. Z pojedyńczymi znakami nie działa prawidłowo.
Crozin
Takie wyrażenie powinno zadziałać:
[JAVASCRIPT] pobierz, plaintext
  1. /(?=a)\d+(?=a)/g
[JAVASCRIPT] pobierz, plaintext
flashdev
Kod
function arrayMap(fun, arr){
    for( var i in arr )
        arr[i] = fun(arr[i]);
    return arr;
}

var tak = 'abcd  a123z (nawias)';
var nie = '123abc';
var res = arrayMap(function(s){
    return s.match(/[a-z][a-z0-9]*/i)[0];
}, (tak+' ' +nie).match(/([^a-z0-9]|^)([a-z][a-z0-9]*)([^a-z0-9]|$)/gim));
alert(res);

http://js.blop.pl/index.php?ZnVuY3Rpb24gYX...mFsZXJ0KHJlcyk7

Cytat(Crozin @ 7.01.2011, 23:28:08 ) *
Takie wyrażenie powinno zadziałać:
[JAVASCRIPT] pobierz, plaintext
  1. /(?=a)\d+(?=a)/g
[JAVASCRIPT] pobierz, plaintext


Probuje przy użyciu ?= i ?! i rzeczywiście to w jakiś sposób powoduje, że w wyniku nie ma tych niechcianych ciągów, ale w tej chwili nie przechodzi prawidłowo mojego przypadku testowego.

Kod
.match(/((?![a-z0-9])|^)([a-z][a-z0-9]*)((?![a-z0-9])|$)/gim)
.match(/((?=[^a-z0-9])|^)([a-z][a-z0-9]*)((?=[^a-z0-9])|$)/gim)
shpyo
Te pętle to na prawdę taki wielki problem? Takie wyrażenie nie powinno zbyt obciążyć klienta. Mnie tylko raz udało się wykrzaczyć przeglądarkę przez JS - były liczone kombinacje z permutacjami. Także taki regex w pętli to nie jest dużo smile.gif.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.