2016-12-11 2 views
3

내가 문자열분할 중괄호 내에서 발생하는 단락 문자를 무시해 정규식 문자열,

Max and Bob and Merry and {Jack and Co.} and Lisa 있다고 가정합시다.

나는 and가 구분 기호, 만이 중괄호 내에서 발생하지 않는 경우 인으로 분할 할 필요가있다.
Max, Bob, Merry, Jack and Co., Lisa :

그래서 위의 문자열에서 나는 5 문자열을 얻어야한다.

나는이 패턴 같은 시도 :

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

을하지만 그것은 작동하지 않습니다 - JackCo. 여전히 (나는 내가 두 번 특수 문자를 탈출해야 ++ C를 사용)과 분할됩니다.

+3

qregexp에서 미리보기를 지원합니까? 그렇다면,''\\ band \\ b (?! [^ {] *})'] (https://regex101.com/r/0Fd1tF/1)가 더 많은 탈출을 필요로 할 수도 있습니다. –

+1

C++에서'R "('및')"'로 묶인 일반 표현식에 * 원시 문자열 리터럴 *을 사용할 수 있습니다. 이렇게하면 백 슬래시를 직접 사용할 수 있습니다. 즉,'R "(\ d *)"' – Meyer

+0

너무 많은 조건으로 나뉘어지기를 원합니다. 2 단계와 일치하는 것이 좋을 것 같습니다. 1) 중괄호 안에있는 내용을 추출합니다. 'QRegExp ("\\ {([^ {}) *) \\}")'와 2)'\\ {[^ {}] * \\} | \\ s * \\ band \\ b \\ s * "' –

답변

2

lookaheads가 QRegExp에서 지원하는 경우가 확인할 수있는 경우 사이에 닫는 }with no opening{가있는 경우 마지막 단어 경계에서 계속 찾고에 의해 내부 중괄호.

See this demo at regex101

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

원하는대로 이스케이프 할 필요 또는 @SMeyer 댓글을 달았처럼 문자 그대로의 원시 문자열을보십시오.

0

먼저 {...} 부분을 일치 시키십시오. 즉, |의 왼쪽에 놓습니다. 가능하면 {foo and bar} 일치합니다,하지만 다음 경우는 and 일치하려고합니다

\{.*?\}|and 

.

+0

이것은'{...} '에서 분리되어 제거됩니다. –

+0

예. 따라서 일치 된 것을 반환하는 분할 함수를 사용하고 싶을 것입니다. – Waxrat

+0

우리가 어떤 언어인지 모르겠지만 파이썬에서는 정규 표현식에서 괄호를 사용하여 반환되는 구분 기호를 얻을 수 있습니다 :'m = re.split (r '(\ {. *? \} | and' , s)' – Waxrat

1

가능한 해결책은 부분적으로는 bobble-bubble의 설명을 기반으로합니다. 공백이나 중괄호를 사용하지 않고 요청 된대로 5 개의 문자열을 생성합니다.

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입니다.