Regex: dopasowanie do pierwszego wystąpienia znaku

Szukam wzorca, który pasuje do wszystkiego aż do pierwszego wystąpienia określonego znaku, powiedzmy"; " - a średnik .

Napisałem tak:

/^(.*);/

Ale w rzeczywistości pasuje do wszystkiego (łącznie ze średnikiem) aż do ostatniego wystąpienia średnika.

 239
Author: Leon Fedotov, 2010-01-06

11 answers

Potrzebujesz

/[^;]*/

[^;] jest klasą znaków , pasuje do wszystkiego oprócz średnika.

Aby przytoczyć perlre manpage:

Możesz określić klasę znaków, załączając listę znaków w [], która będzie pasować do dowolnego znaku z listy. Jeśli pierwszy znak po " ["to"^", klasa pasuje do dowolnego znaku spoza listy.

Powinno to działać w większości dialektów regex.

 355
Author: sleske,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-12 22:45:40

Would;

/^(.*?);/
Praca?

? jest operatorem leniwym, więc regex chwyta jak najmniej przed dopasowaniem ;.

 206
Author: RJFalconer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-10 18:01:20

/^[^;]*/

[ ^ ;] mówi dopasuj cokolwiek poza średnikiem. Nawiasy kwadratowe są operatorem dopasowującym zbiór, zasadniczo pasują do dowolnego znaku w tym zbiorze znaków, ^ na początku sprawia, że jest to odwrotne dopasowanie, więc dopasuj cokolwiek , a nie w tym zbiorze.

 32
Author: Glenn Slaven,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-06 13:26:59

Try /[^;]*/

Google regex character classes po szczegóły.

 14
Author: Dan Breslau,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-06 13:49:57

Try /[^;]*/

To negacja klasy znaków .

 9
Author: Skilldrick,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-06 13:21:08

To nie jest rozwiązanie regex, ale coś wystarczająco prostego do opisu problemu. Po prostu Podziel swój ciąg i pobierz pierwszy element z tablicy.

$str = "match everything until first ; blah ; blah end ";
$s = explode(";",$str,2);
print $s[0];

Wyjście

$ php test.php
match everything until first
 5
Author: ghostdog74,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-06 14:31:33

Przykładowy tekst:

"this is a test sentence; to prove this regex; that is g;iven below"

Jeśli na przykład mamy przykładowy tekst powyżej, regex /(.*?\;)/ da Ci wszystko do pierwszego wystąpienia średnika (;), łącznie ze średnikiem: "this is a test sentence;"

 5
Author: poncius,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-20 13:26:13

To było bardzo pomocne dla mnie, ponieważ próbowałem dowiedzieć się, jak dopasować wszystkie znaki w znaczniku xml, w tym atrybuty. Natknąłem się na problem "dopasowuje wszystko do końca"z:

/<simpleChoice.*>/

Ale udało się rozwiązać problem za pomocą:

/<simpleChoice[^>]*>/

Po przeczytaniu tego postu. Dziękuję wszystkim.

 4
Author: Yardboy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-05 14:26:26

"/^([^\/]*)\/$/" mi się udało, aby uzyskać tylko top "foldery" z tablicy typu:

a/   <- this
a/b/
c/   <- this
c/d/
/d/e/
f/   <- this
 3
Author: sPooKee,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-06 18:57:52

Naprawdę trochę smutne, że nikt nie dał prawidłowej odpowiedzi....

In regex,? nie jest chciwy. Domyślnie regex będzie pasował jak najwięcej (greedy)

Wystarczy dodać a ? i to będzie nie chciwy i dopasować jak najmniej!

Powodzenia, mam nadzieję, że to pomoże.

 3
Author: L1amm,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-19 21:01:51

To dopasuje się do pierwszego wystąpienia tylko w każdym łańcuchu i zignoruje kolejne wystąpienia.

/^([^;]*);*/
 2
Author: mchid,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-27 13:59:44