2016-12-11 16 views
3

Предположим, у меня есть строкаРазбиваем строку с регулярным выражением, игнорируя разделители, которые происходят в фигурные скобки

Max and Bob and Merry and {Jack and Co.} and Lisa.

мне нужно разделить его с and быть разделителем, , но только если это не происходит в фигурных скобках.

Так из приведенных выше строк, я должен получить 5 строк:
Max, Bob, Merry, Jack and Co., Lisa.

Я пытался что-то вроде этого шаблона:

[^\\\{.+]\\band\\b[^.+\\\}] 

Но это не работает - Jack и Co. все еще разделены, а также (я использую C++, так что я должен бежать специальные символы дважды).

+3

Есть ли образы, поддерживаемые qregexp? Если да, попробуйте ['\\ band \\ b (?! [^ {] *})'] (Https://regex101.com/r/0Fd1tF/1), возможно, потребуется больше экранов. –

+1

В C++ вы можете использовать * raw string literal * для регулярных выражений, заключенных в 'R" ('и') ". Таким образом, обратная косая черта может использоваться напрямую, т. Е. 'R" (\ d *) "' – Meyer

+0

Вы хотите разбить со слишком многими условиями, что похоже на совпадение с двумя шагами, может оказаться лучше: 1) извлечь то, что находится внутри фигурных скобок с помощью 'QRegExp (" \\ {([^ {}] *) \\} ")' и 2) расщепляется на '' \\ {[^ {}] * \\} | \\ s * \\ band \\ b \\ s * "' –

ответ

2

Если lookaheads поддерживаются QRegExp вы можете проверить, если внутри скобок, посмотрев вперед на конечной границе слова, если есть закрытие }with no opening{ между ними.

\band\b(?![^{]*}) 

See this demo at regex101

Нужно быть экранированы, как желательные или попробовать сырой строковый литерал, как @SMeyer прокомментировал.

0

Дать {...} часть матча первой. То есть, положите его на левую сторону |.

\{.*?\}|and 

Это будет соответствовать {foo and bar}, если это возможно, но если нет, то он будет пытаться соответствовать and.

+0

Это разделится на '{...}', удалив его. –

+0

Да. Таким образом, вы, скорее всего, захотите использовать функцию split, которая возвращает то, что было сопоставлено. – Waxrat

+0

Не знаю, на каком языке мы говорим, но в Python вы можете получить разделители, возвращенные с помощью парсеров в регулярном выражении: 'm = re.split (r '(\ {. *? \} | And)' , s) ' – Waxrat

1

Это возможное решение, частично основанное на комментарии bobble-bubble. Он будет производить пять строк по запросу, без окружающих пробелов или фигурных скобок.

std::string text = "Max and Bob and Merry and {Jack and Co.} and Lisa"; 
std::regex re(R"(\}? +and +(?![^{]*\})\{?)"); 

std::sregex_token_iterator it(text.begin(), text.end(), re, -1); 
std::sregex_token_iterator end; 

while (it != end) 
    std::cout << *it++ << std::endl; 

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