![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
![]() Grupa: Zarejestrowani Postów: 812 Pomógł: 117 Dołączył: 2.12.2008 Ostrzeżenie: (10%) ![]() ![]() |
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 -------------------- |
|
|
![]()
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] ); -------------------- jQuery, JavaScript i CSS - porady, tutoriale
highlab.pl - blog o technologiach, nauce i programowaniu |
|
|
![]()
Post
#3
|
|
![]() Grupa: Zarejestrowani Postów: 812 Pomógł: 117 Dołączył: 2.12.2008 Ostrzeżenie: (10%) ![]() ![]() |
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. -------------------- |
|
|
![]()
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 -------------------- |
|
|
![]()
Post
#5
|
|
![]() Grupa: Zarejestrowani Postów: 812 Pomógł: 117 Dołączył: 2.12.2008 Ostrzeżenie: (10%) ![]() ![]() |
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. -------------------- |
|
|
![]()
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 ![]() -------------------- |
|
|
![]()
Post
#7
|
|
![]() Grupa: Zarejestrowani Postów: 812 Pomógł: 117 Dołączył: 2.12.2008 Ostrzeżenie: (10%) ![]() ![]() |
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 ![]() 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. -------------------- |
|
|
![]()
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
![]() -------------------- |
|
|
![]()
Post
#9
|
|
![]() Grupa: Zarejestrowani Postów: 812 Pomógł: 117 Dołączył: 2.12.2008 Ostrzeżenie: (10%) ![]() ![]() |
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 ![]() 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. -------------------- |
|
|
![]()
Post
#10
|
|
![]() Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
|
|
|
![]()
Post
#11
|
|
![]() Grupa: Zarejestrowani Postów: 812 Pomógł: 117 Dołączył: 2.12.2008 Ostrzeżenie: (10%) ![]() ![]() |
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 Takie wyrażenie powinno zadziałać:
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) -------------------- |
|
|
![]()
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
![]() -------------------- jQuery, JavaScript i CSS - porady, tutoriale
highlab.pl - blog o technologiach, nauce i programowaniu |
|
|
![]() ![]() |
![]() |
Aktualny czas: 22.08.2025 - 04:00 |