Вопрос:

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

regex

34432 просмотра

5 ответа

97420 Репутация автора

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} ?

Автор: Mark Biek Источник Размещён: 22.08.2008 02:10

Ответы (5)


104 плюса

6158 Репутация автора

Решение

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

Project name:\s+(.*?)\s+J[0-9]{7}:
Автор: jj33 Размещён: 22.08.2008 02:12

12 плюса

417470 Репутация автора

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

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

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

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

Автор: Konrad Rudolph Размещён: 22.08.2008 02:15

1 плюс

1700 Репутация автора

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

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

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

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

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

Автор: Hershi Размещён: 22.08.2008 02:17

4 плюса

6337 Репутация автора

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

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

string m = Regex.Match(s, @"Project name: (?<name>.*?) J\d+").Groups["name"].Value;
Автор: Svend Размещён: 22.08.2008 02:24

0 плюса

211 Репутация автора

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

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

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

Автор: Shailendra Размещён: 16.07.2018 08:05
Вопросы из категории :
32x32