Mirki, pytanko mam szybciutkie do was, chciał bym nauczyć się wyrażeń regularnych w #php. Wymyśliłem sobie zadanie, mam jakiś string, wewnątrz niego jakieś teksty i kilka linków:
test
oraz kilka innych, np:
test2

teraz chciał bym wyciągnąć to co jest między znacznikami ten tekst, pamiętajmy że link może mieć klasę, title itd. ale nie musi!

pregmatchall("/(.+)<\/a>/", $string, $matches, PREGSETORDER);

to zwraca mi tablicę, ale nie tylko to
@Govr: najprościej chyba

(.*?)
i wtedy pierwszą tablice będziesz miał całość tego wyrażenia, a w każdej kolejnej nawiasy, w tym przypadku "tutaj" dla każdej złapanej linii.
Przy okazji polecam sobie testować regexy np tu. http://www.phpliveregex.com/

EDIT: w sumie to nie do końca odpowiedziałem na Twoje pytanie, w każdym razie oprócz całości wyrażenia to nawiasami () wyciągasz te dane, które chcesz zachować. Nie słyszałem o pomijaniu całości
  • Odpowiedz
Mam łańcuch znaków w postaci XAX, gdzie X to pewien znak powtórzony określoną ilość razy, a A to łańcuch dowolnych znaków za wyjątkiem liczb i konkretnego podłańcucha znaków. Jak wyglądałoby wyrażenie regularne dla takiego łańcucha? Chodzi mi konkretnie o wykluczenie tego konkretnego podłańcucha z łańcucha A.

Przykład:

--------
Przykładowy tekst gdzie
znajdować się może znak - (nie mogący się powtórzyc 8 razy pod rząd),
ale też każdy inny.
--------
Jakiś dalszy tekst.
Mam taki ciąg:

1 2 23 54 24 (liczby rozdzielone spacjami, bez określonej długości liczby).

Próbuję stworzyć regex, który wyłapałby mi każdą z liczb z osobna i wrzucił do grupy. Chciałem łapać najpierw pierwszą liczbę, po czym łapać pary (spacja)(liczba).

(\d+)(?: (\d+))+ - takie coś nie działa - łapie mi tylko pierwszą liczbę i ostatnią, te pomiędzy pomija kompletnie - czemu się tak dzieje i jak zrobić to poprawnie? Link do
@asunez: Regex ma dokładnie tyle grup, ile ma par nawiasów (nie licząc grupy zerowej). Nie można wsadzić nawiasu w gwiazdkę i mieć zmiennej ilości grup, a przynajmniej nie w standardowych implementacjach.
  • Odpowiedz
@Pitzonik:

Można używać lookbehind w języku w którym kodzisz?

W JS-ie nie ma (póki co) lookbehindów, choć są lookaheady.

@sokytsinolop:
Nie musisz się ich pozbywać. Po prostu w drugim argumencie .replace() odnieś się nie do całego dopasowania ($&), tylko do pierwszej grupy przechwytującej (użyj $1). Wyrażenie regularne pozostaje to samo. Tj.

s.replace(emoticonRegex, '![](img/emoticons/$1.svg)')
  • Odpowiedz
/().*(?=<\/h2>)/igm
Mam takie wyrażenie. Jak można wyłączyć z zaznaczania ``, tak aby tylko zostały same tytuły, które są wewnątrz tagów?

#wyrazeniaregularne #regexp #programowanie
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Witam regexpowe swiry,
Jako ze jestem leszczem w temacie, potrzebuje wyrazenie ktory dany string:

Wartosc1;Wartosc2;Wartosc3;ZnakSpecjalny=';';Wartosc4;Wartosc5;

zesplituje po ; na

1.Wartosc1
2.Wartosc2
3.Wartosc3
4.ZnakSpecjalny=';'
5.Wartosc4
6.Wartosc5
etc

Chyba, ze znacie w c# jakis bardziej elegancki sposob, ale zalezy mi zeby w miare szybko dzialalo
#programowanie #regexp #wyrazeniaregularne #dotnet #csharp
@Sir_Nick:
nie bardzo, po pierwsze [0-9] a nie (0-9) jak range, i czemu escapy przed '-'? a #!$%@?ąc od tego że to będzie łapało więcej niż potrzeba to prościej \d{4}-\d{2}-\d{2}
  • Odpowiedz
@imlmpe #wyrazeniaregularne #programowanie

W bardzo dużej ilości plików chcę zamienić w nazwie pliku jeden znak (konkretnie kropkę) sąsiadujący z cyfrą po lewej na inne znaki ale bez zamieniania cyfry. Jak wpiszę coś takiego:

[0-9]\.
albo coś takiego
\d\.

To cyfrę też mi zamienia na inne znaki a chcę, żeby cyfra w nazwie została. Jak to zrobić?
Próbuję napisać takie wyrażenie, które wyłapie mi identyfikator wpisu tylko pod warunkiem, że podany link nie jest komentarzem na mikroblogu.
Próbowałem w ten sposób, że jeśli po id wpisu wystąpi #comment to #regexp nie powinien niczego znaleźć. Jednak nie działa.

wpis\/(\d+)\/?(?!#comment)
www.wykop.pl/wpis/17072663/#comment-59461313

Innymi słowy - chcę zaznaczyć tekst wpis/ po nim identyfikator cyfrowy, następnie opcjonalnie /(slash) tylko pod warunkiem, że po tym slashu nie ma #comment

https://regex101.com/r/wQ4hQ6/1
#wyrazeniaregularne #
@niemaKlapka: To nie wypali gdy po slashu wystąpi opis z kilkoma pierwszymi wyrazami z początku wpisu, np:
www.wykop.pl/wpis/17080699/probuje-napisac-takie-wyrazenie-ktore-wylapie-mi-i

Moje rozwiązanie @a231:
/wpis\/(\d+)(\/(?!#comment)|$)/g
  • Odpowiedz
Hej mirki, mam taką sprawę, problem w tym że pilną.. Mam katalog, który zawiera w sobie ogromną ilość podkatalogów, w których jest bardzo dużo małych plików.
Musze znaleźć te, które mają maksymalnie 4 znaki w nazwie pliku.
Rzecz się dzieje na windows 7, więc wymyśliłem, że najwygodniej będzie przez total commander przy użyciu wyrażeń regularnych, ale - jak to zapisać żebym w wyniku otrzymał to czego potrzebuje?

#algorytmy
#wyrazeniaregularne
#regex
#regexp
#
@Wyrewolwerowanyrewolwer: sam kiedyś miałem podobny problem, generalnie chodzi o to że czasem jak wpiszesz z łapy 4 backslashe (np jako argument), to najpierw kompilator escapuje 2 razy po 2 backlashe, a potem parser regexpa te już wyescapowane 2 backslashe escapuje do jednego ostatecznego. Wiem że nie umiem tłumaczyć i nie wiem czy dobrze mówię, ale to tak w skrócie ( ͡° ͜ʖ ͡°)
  • Odpowiedz
@Wyrewolwerowanyrewolwer: Rzecz jest w zasadzie prosta i znana we wszystkich jezykach. Masz tutaj dwa poziomy escapowania. Najpierw jest escapowanie stringow normalnie w jezyku programowania. Stad dziala np. "\n" jako nowa linia, a "\" zostawia w efekcie pojedynczy "\".

Drugi poziom to regex, w ktorym niestety tez "\" sluzy do escapowania. W efekcie jest tak jak napisal @hamster151:

"\" -> javac -> "\" -> regex -> "\"


W wielu jezykach programowania
  • Odpowiedz
Czy wyrażenia regularne działają jakoś inaczej w pythonie niż gdziekolwiek indziej?
Mam taki kod:

q = re.compile('math|is|fun')
if q.match("smathfuni"):

Szukam wyrazów, które zawierają w sobie którąś z sekwencji znaków 'math', 'is', 'fun'. Ten regex zdaje się działać testowany w przeznaczonych do tego serwisach. Jednak w powyższym kodzie if zwraca false. O co chodzi?

#wyrazeniaregularne #regexp #programowanie

Potrzebuję kilkunastu dobrze sprawdzonych wyrażeń regularnych (np. do walidacji formularzy tzn. np. z datą, godziną, emailem, numerem telefonu itd. itd).

Mógłbym sam je napisać, ale nie będą idealne. Mógłbym poszukać forach/stackoverflow, ale też nie jest pewne, że nie zawierają jakiś błędów.

Najchętniej wziąłbym z jakiegoś gotowca napisanego przez profesjonalistów. Wiem, że np. w C# (ASP.NET) są zaszyte gotowe do sprawdzania, podobnie jest chyba w AngularJS. Nie wiem tylko jak
No i np. dla emaila coś jest: https://github.com/hibernate/hibernate-validator/blob/6ae19900e2951513034534f9aec786689da9b4d8/engine/src/test/java/org/hibernate/validator/test/internal/engine/methodvalidation/returnvaluevalidation/ContactBean.java


@mk321: To jest faktycznie „tylko” test czy walidacja działa poprawnie.

Tu masz „constrainty”, czyli „definicje” co należy zwalidować, np możesz jakieś pole obiektu oznaczyć „constraintem” URL, dzięki czemu system walidacji wie, że ma sprawdzić, że pole jest URLem:
https://github.com/hibernate/hibernate-validator/tree/master/engine/src/main/java/org/hibernate/validator/constraints

Tu masz „walidatory” – czyli klasy, które sprawdzają wartości odpowiadające zdefiniowanym constraintom:
https://github.com/hibernate/hibernate-validator/tree/master/engine/src/main/java/org/hibernate/validator/internal/constraintvalidators

Np tutaj masz ową walidację URLa:
https://github.com/hibernate/hibernate-validator/blob/6ae19900e2951513034534f9aec786689da9b4d8/engine/src/main/java/org/hibernate/validator/internal/constraintvalidators/hv/URLValidator.java

----

Podobną strukturę
  • Odpowiedz
@MacDada: o to mi chodziło :) Dzięki :)


Właśnie nie mogłem znaleźć tych klas "walidatorów".

Teraz widzę, że od środka wygląda to trochę inaczej niż myślałem, i raczej mniej niż więcej jest oparte na wyrażeniach regularnych (no i jednak nie mogę ich tak łatwo skopiować).

No i w emailu odwołują się do RFC, ale nie implementują całości, bo nie potrzeba - to chciałem wiedzieć.
  • Odpowiedz