Regex: соответствие до первого появления символа

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

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

/^(.*);/

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

Ответ 1

Вам нужно

/[^;]*/

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

Чтобы привести perlre manpage:

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

Это должно работать в большинстве диалектов regex.

Ответ 2

Would;

/^(.*?);/

работа?

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

Ответ 3

/^[^;]*/

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

Ответ 4

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

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

Ответ 6

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

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

Выход

$ php test.php
match everything until first

Ответ 7

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

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

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

Ответ 8

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

/<simpleChoice.*>/

но смог решить проблему с помощью:

/<simpleChoice[^>]*>/

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

Ответ 9

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

a/   <- this
a/b/
c/   <- this
c/d/
/d/e/
f/   <- this

Ответ 10

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

В regex,? делает его не жадным. По умолчанию regex будет соответствовать столько, сколько может (жадный)

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

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

Ответ 11

Это будет соответствовать первому вхождению только в каждой строке и будет игнорировать последующие вхождения.

/^([^;]*);*/