регулярное выражение исключить матч из захвата - PullRequest
4 голосов
/ 27 июля 2010

Использование Regex в .Net

У меня будет набор данных, который выглядит примерно так:

< Bunch o' Data Here >

, где < - просто индикатор новой записи, а > - это конец записи.

эти записи могут входить вот так

< Dataset 1><Dataset 2 broken, no closing tag <dataset 3>

они также могут приходить как

< Dataset 1>Dataset 2 broken, no opening tag ><dataset 3>

хотя, я 'Я не уверен, что этот последний случай возможен, и я перейду этот мост, когда мне придется.

Я пытаюсь использовать Regex, чтобы разделить их на записи на основе этого начального и конечного символов, в конечном итоге что-то вроде этого

Match 1 = < Dataset 1>
Match 2 = <Dataset 2 broken, no closing tag 
Match 3 = <Dataset 3>

Я пытаюсь выяснить, какзахват групп работает, и, возможно, мое понимание неверно.

<.*?(?:<|>)

, я думаю, довольно близко подходит ко мне, за исключением того, что он включает в себя вводный символ 3-го набора данных и захват второй группы.Я также подозреваю, что ?: не делает то, что ему нужно, и если он его вынимает, он возвращает тот же набор совпадений (2).

Ответы [ 4 ]

7 голосов
/ 27 июля 2010

Похоже, вы перевернули. Вы хотите использовать ?:, чтобы не захватывать группу, а не :?.

 <.*?(?:<|>)

Чтобы немного расширить: оператор ? в группе захвата означает, что вы хотите сделать что-то особенное. : означает не захватывать, но есть другие операнды, которые вы можете дать ? для выполнения других действий. Обычными являются упреждающие (?=) и упреждающие (?<), но есть много других.

Я также только что понял, что вы пытаетесь сопоставить (за исключением проблемы с захватом). Язык парных / квадратных скобок и т. Д. Не является регулярным, поэтому - если я правильно понимаю вашу цель - вам нужно создать довольно сложное расширенное регулярное выражение, чтобы соответствовать желаемому. Есть несколько других SO вопросов по этому поводу, в том числе этот , в котором обсуждаются некоторые вопросы.

1 голос
/ 27 июля 2010

Я думаю, что нашел более простое решение

\<.*?(\>|(?=\<)|$)

похоже на работу. Я избежал отметок <> для согласованности

РЕДАКТИРОВАТЬ: добавлен $, чтобы учесть неразрывную в конце строки

1 голос
/ 27 июля 2010

Я думаю, что вы ищете lookahead , а не группу без захвата. Но простое изменение :? (sic) на ?= не даст правильной работе регулярному выражению. Если между закрывающей > и следующей < нет текста, попробуйте следующее:

<?[^<>]+>?(?=(?:<|$))

Работает, если отсутствует закрывающее >, но не если отсутствует открывающее <.

1 голос
/ 27 июля 2010

Как насчет чего-то простого: <[^ <>] +> | [^ <>] +> | <[^ <>] +

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...