Мое регулярное выражение подходит слишком много. Как заставить его остановиться?

J0000000: Transaction A0001401 started on 8/22/2008 9:49:29 AM J0000010: Project name: E:\foo.pf J0000011: Job name: MBiek Direct Mail Test J0000100: Machine name: DEV J0000100: Project file: E:\mbiek\foo.pf J0000100: Template file: E:\mbiek\foot.xdt J0000100: Job name: MBiek J0000100: Output folder: E:\foo\A0001401 J0000100: Temp folder: E:\foo\Output\A0001401 J0000100: Document 1 - Starting document J0005000: Document 1 - Text overflowed on page 1 (warning) J0000101: Document 1 - 1 page(s) composed J0000102: Document 1 - 1 page(s) rendered at 500 x 647 pixels J0000100: Document 1 - Completed successfully J0000020: 

У меня есть эта гигантская уродливая строка, и я пытаюсь извлечь fragmentы из нее с помощью регулярного выражения.

В этом случае я хочу захватить все после «Название проекта» до той части, где он говорит «J0000011:» (каждый раз каждый раз будет каждый раз один раз).

Вот регулярное выражение, с которым я играл

 Project name:\s+(.*)\s+J[0-9]{7}: 

Проблема в том, что он не останавливается, пока не попадет на J0000020: в конце.

Как сделать остановку регулярного выражения при первом вхождении J [0-9] {7} ?

Сделайте .* Не жадный, добавив ‘ ? ‘ после этого:

 Project name:\s+(.*?)\s+J[0-9]{7}: 

Использование не жадных кванторов здесь, вероятно, является лучшим решением, также потому, что оно более эффективно, чем жадная альтернатива: жадные совпадения обычно идут насколько это возможно (здесь, до конца текста!), А затем отслеживать символ после символа чтобы попытаться совместить часть, которая будет потом.

Однако рассмотрите вместо этого использование отрицательного classа символов:

 Project name:\s+(\S*)\s+J[0-9]{7}: 

\S означает «все, кроме пробелов, и это именно то, что вы хотите.

Ну, ".*" – жадный селектор. Вы делаете это не жадным, используя ".*?" При использовании последней конструкции движок регулярных выражений будет на каждом шаге соответствовать тексту в "." попытаться сопоставить все, что приходит после ".*?" , Это означает, что если, например, ничего не происходит после ".*?" , то он ничего не соответствует.

Вот что я использовал. s содержит вашу исходную строку. Этот код специфичен для .NET, но большинство вариантов регулярного выражения будут иметь нечто похожее.

 string m = Regex.Match(s, @"Project name: (?.*?) J\d+").Groups["name"].Value; 

Я бы также рекомендовал вам экспериментировать с регулярными выражениями с помощью «Expresso» – это утилита – отличная (и бесплатная) утилита для редактирования и тестирования регулярных выражений.

Одним из его преимуществ является то, что его пользовательский интерфейс предоставляет множество функций регулярного выражения, которые могут быть незнакомы с людьми, не имеющими опыта в регулярном выражении, таким образом, чтобы им было легко изучить эти новые концепции.

Например, при создании своего регулярного выражения с использованием пользовательского интерфейса и выборе «*» у вас есть возможность установить флажок «Как можно меньше» и увидеть результирующее резум, а также проверить его поведение, даже если вы не знакомы с не жадные выражения раньше.

Доступны для загрузки на их сайте: http://www.ultrapico.com/Expresso.htm

Экспресс-загрузка: http://www.ultrapico.com/ExpressoDownload.htm

(Название проекта: \ s + [AZ]: (?: \\ w +) +. [A-zA-Z] + \ s + J [0-9] {7}) (? = 🙂

Это будет работать для вас.

Добавление (?: \\ w +) +. [A-zA-Z] + будет более ограничительным, а не. *

  • Сделать регистр с регулярным выражением нечувствительным в ASP.NET RegularExpressionValidator
  • Регулярное выражение для исключения слова / строки
  • Регулярное выражение
  • Получить окончательный специальный символ с регулярным выражением
  • Регулярное выражение для соответствия действительным датам
  • Регулярное выражение для извлечения текста между квадратными скобками
  • Как сделать часть регулярного выражения необязательной?
  • Граница слова регулярного выражения (\ b) и пробелы
  • Регулярное выражение для буквенно-цифровых и подчеркиваний
  • RegEx для исключения конкретной строковой константы
  • Как сопоставить любой символ в нескольких строках в регулярном выражении?
  • Давайте будем гением компьютера.