Regex: соответствие до первого появления символа
Я ищу шаблон, который соответствует всем до первым вхождением определенного символа, скажем, ";" - точка с запятой.
Я написал это:
/^(.*);/
Но он фактически соответствует всем (включая точку с запятой) до последнего вхождения точки с запятой.
Ответы
Ответ 1
Вам нужно
/[^;]*/
[^;]
- это класс символов, он соответствует всем, кроме точки с запятой.
Чтобы привести perlre
manpage:
Вы можете указать класс символов, включив список символов в [], который будет соответствовать любому символу из списка. Если первый символ после "[" равен "^", класс соответствует любому символу, не указанному в списке.
Это должно работать в большинстве диалектов regex.
Ответ 2
Would;
/^(.*?);/
работа?
"?" является ленивым оператором, поэтому регулярное выражение захватывает как можно меньше, прежде чем сопоставлять:.
Ответ 3
/^[^;]*/
[^;] говорит совпадение с чем-либо, кроме точки с запятой. Квадратные скобки - это оператор сопоставления множеств, по существу, соответствующий любому символу в этом наборе символов, ^
в начале делает его обратным совпадением, поэтому сопоставляем что-либо не в этом наборе.
Ответ 4
Попробуйте /[^;]*/
Google regex character classes
для деталей.
Ответ 5
Попробуйте /[^;]*/
Это отрицательный класс символов.
Ответ 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
Это будет соответствовать первому вхождению только в каждой строке и будет игнорировать последующие вхождения.
/^([^;]*);*/