Регулярное выражение: соответствие до первого вхождения символа - PullRequest
279 голосов
/ 06 января 2010

Я ищу шаблон, который соответствует всем до первого вхождения определенного символа, скажем ";" - точка с запятой .

Я написал это:

/^(.*);/

Но на самом деле оно соответствует всему (включая точку с запятой) до последнего появления точки с запятой.

Ответы [ 11 ]

415 голосов
/ 06 января 2010

Вам нужно

/[^;]*/

[^;] - это класс символов , он соответствует всему, кроме точки с запятой.

Цитировать справочную страницу perlre:

Вы можете указать класс символов, заключив список символов в [], который будет соответствовать любому символу из списка. Если первым символом после «[» является «^», класс соответствует любому символу, отсутствующему в списке.

Это должно работать на большинстве диалектов регулярных выражений.

243 голосов
/ 06 января 2010

Would;

/^(.*?);/

работа

? - это ленивый оператор, поэтому регулярное выражение захватывает как можно меньше, прежде чем сопоставить ;.

32 голосов
/ 06 января 2010

/^[^;]*/

[^;] говорит, что соответствует чему угодно, кроме точки с запятой. Квадратные скобки - это оператор сопоставления наборов, по сути, они соответствуют любому символу в этом наборе символов, ^ в начале делает его обратным, поэтому сопоставляйте что угодно , а не в этом наборе.

15 голосов
/ 06 января 2010

Попробуйте /[^;]*/

Google regex character classes для деталей.

10 голосов
/ 06 января 2010

Попробуйте /[^;]*/

Это отрицательный класс символов .

6 голосов
/ 20 января 2012

образец текста:

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

Если, например, у нас есть образец текста выше, регулярное выражение /(.*?\;)/ даст вам все до первого появления точки с запятой (;), включая точку с запятой: "this is a test sentence;"

5 голосов
/ 06 января 2010

это не решение регулярных выражений, а нечто достаточно простое для описания вашей проблемы. Просто разбейте вашу строку и получите первый элемент из вашего массива.

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

выход

$ php test.php
match everything until first
4 голосов
/ 05 февраля 2011

Это было очень полезно для меня, поскольку я пытался выяснить, как сопоставить все символы в теге xml, включая атрибуты. Я столкнулся с проблемой "соответствует все до конца" с:

/<simpleChoice.*>/

, но удалось решить проблему с:

/<simpleChoice[^>]*>/

после прочтения этого поста. Спасибо всем.

3 голосов
/ 20 сентября 2014

Действительно печально, что никто не дал вам правильный ответ ....

В регулярных выражениях? делает это не жадным. По умолчанию регулярное выражение будет соответствовать как можно больше (жадный)

Просто добавить? и это будет не жадным и соответствовать как можно меньше!

Удачи, надеюсь, это поможет.

3 голосов
/ 06 июня 2012

"/^([^\/]*)\/$/" работал для меня, чтобы получить только верхние «папки» из массива, как:

a/   <- this
a/b/
c/   <- this
c/d/
/d/e/
f/   <- this
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...