Регулярное выражение: соответствие до первого вхождения символа

213

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

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

/^(.*);/

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

  • 47
    /^(.*?);/ также должен работать (он называется не жадным ), но приведенные ответы с использованием [^;]* лучше.
  • 0
    как бы вы выбрали все, после точки с запятой, а не точку с запятой.
Показать ещё 2 комментария
Теги:

11 ответов

288
Лучший ответ

Вам нужно

/[^;]*/

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

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

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

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

177

Would;

/^(.*?);/

работа?

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

  • 3
    Да, помните, что TMTOWTDI - это лейтмотив :) en.wikipedia.org/wiki/TMTOWTDI
  • 3
    да, но после бикарбонатного расширения Тима Тоади, я считаю, что отрицательные классы персонажей выигрывают, так как ленивый квантификатор включает обратный ход. +1 в любом случае.
Показать ещё 1 комментарий
30

/^[^;]*/

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

  • 2
    Имейте в виду, что первый ^ в этом ответе дает регулярному выражению совершенно другое значение: оно заставляет регулярное выражение искать только совпадения, начинающиеся с начала строки. В этом случае это было бы эффективно, если вы запускаете регулярное выражение только один раз. Если вы хотите найти несколько совпадений в одной строке, первый ^ должен идти.
  • 4
    Он сказал, что хочет сопоставить все до первого появления точки с запятой, поэтому я предположил, что он имел в виду с самого начала строки.
13

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

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

9

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

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

5

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

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

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

  • 1
    не нужно убегать ; char, потому что это не регулярное выражение специального символа. Группировка () не требуется. Вы можете пойти с /.*?;/
  • 0
    да, вы совершенно правы побег был больше похож на «лучше, чем потом сожалеть»
Показать ещё 1 комментарий
5

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

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

Выход

$ php test.php
match everything until first
3

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

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

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

/<simpleChoice.*>/

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

/<simpleChoice[^>]*>/

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

  • 0
    Я обнаружил, что на самом деле более эффективно анализировать (для каждого языка или фреймворка для этого есть свои классы) html / xml из-за его машинного формата, регулярные выражения предназначены для естественного языка.
  • 0
    Ницца. Я использовал это для исправления XML-документов с синтаксическими ошибками в <!DOCTYPE> . Так как парсер не смог с этим справиться.
2

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

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

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

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

  • 2
    Это сильно зависит от фактической реализации регулярных выражений, и не каждая реализация имеет жадный режим.
1

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню