Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> RegExp /g
flashdev
post
Post #1





Grupa: Zarejestrowani
Postów: 812
Pomógł: 117
Dołączył: 2.12.2008

Ostrzeżenie: (10%)
X----


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.

Ten post edytował flashdev 7.01.2011, 13:19:45
Go to the top of the page
+Quote Post
shpyo
post
Post #2





Grupa: Zarejestrowani
Postów: 574
Pomógł: 2
Dołączył: 13.04.2004
Skąd: Lublin

Ostrzeżenie: (0%)
-----


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] );
Go to the top of the page
+Quote Post
flashdev
post
Post #3





Grupa: Zarejestrowani
Postów: 812
Pomógł: 117
Dołączył: 2.12.2008

Ostrzeżenie: (10%)
X----


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.
Go to the top of the page
+Quote Post
kamil4u
post
Post #4





Grupa: Zarejestrowani
Postów: 2 350
Pomógł: 512
Dołączył: 4.01.2009
Skąd: Wrocław / Świdnica

Ostrzeżenie: (0%)
-----


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/

Ten post edytował kamil4u 7.01.2011, 21:40:32
Go to the top of the page
+Quote Post
flashdev
post
Post #5





Grupa: Zarejestrowani
Postów: 812
Pomógł: 117
Dołączył: 2.12.2008

Ostrzeżenie: (10%)
X----


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.
Go to the top of the page
+Quote Post
kamil4u
post
Post #6





Grupa: Zarejestrowani
Postów: 2 350
Pomógł: 512
Dołączył: 4.01.2009
Skąd: Wrocław / Świdnica

Ostrzeżenie: (0%)
-----


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 (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
flashdev
post
Post #7





Grupa: Zarejestrowani
Postów: 812
Pomógł: 117
Dołączył: 2.12.2008

Ostrzeżenie: (10%)
X----


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 (IMG:style_emoticons/default/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.
Go to the top of the page
+Quote Post
kamil4u
post
Post #8





Grupa: Zarejestrowani
Postów: 2 350
Pomógł: 512
Dołączył: 4.01.2009
Skąd: Wrocław / Świdnica

Ostrzeżenie: (0%)
-----


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 (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
flashdev
post
Post #9





Grupa: Zarejestrowani
Postów: 812
Pomógł: 117
Dołączył: 2.12.2008

Ostrzeżenie: (10%)
X----


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 (IMG:style_emoticons/default/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.
Go to the top of the page
+Quote Post
Crozin
post
Post #10





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


Takie wyrażenie powinno zadziałać:
[JAVASCRIPT] pobierz, plaintext
  1. /(?=a)\d+(?=a)/g
[JAVASCRIPT] pobierz, plaintext
Go to the top of the page
+Quote Post
flashdev
post
Post #11





Grupa: Zarejestrowani
Postów: 812
Pomógł: 117
Dołączył: 2.12.2008

Ostrzeżenie: (10%)
X----


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)
Go to the top of the page
+Quote Post
shpyo
post
Post #12





Grupa: Zarejestrowani
Postów: 574
Pomógł: 2
Dołączył: 13.04.2004
Skąd: Lublin

Ostrzeżenie: (0%)
-----


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 (IMG:style_emoticons/default/smile.gif) .
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 23.08.2025 - 15:21