xml как вырезать каждый XML-файл в отдельный файл [duplicate]

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:

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

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

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

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

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

Как сделать остановку регулярного выражения при первом вхождении J0000020: ?

51
задан 17 December 2017 в 02:32

4 ответа

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

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

string m = Regex.Match(s, @"Project name: (?<name>.*?) J\d+").Groups["name"].Value;
3
ответ дан 15 August 2018 в 14:31

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

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

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

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

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

1
ответ дан 15 August 2018 в 14:31

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

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

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

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

9
ответ дан 15 August 2018 в 14:31

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

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

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

0
ответ дан 15 August 2018 в 14:31

Другие вопросы по тегам:

Похожие вопросы: