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 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 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 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 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 smile.gif.


--------------------
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 22.08.2025 - 04:00