Подтвердить что ты не робот

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

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
J0000020: Document 1 - Completed successfully

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

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

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

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

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

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

4b9b3361

Ответ 1

Сделайте .* неживым, добавив после этого < <21 > :

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

Ответ 2

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

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

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

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

Ответ 3

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

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

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

Ответ 4

Я бы также рекомендовал вам экспериментировать с регулярными выражениями с помощью "Expresso" - это полезная утилита для большой (и бесплатной) утилиты для редактирования и тестирования регулярных выражений.

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

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

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

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

Ответ 5

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

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

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