집 >백엔드 개발 >C#.Net 튜토리얼 >.net C# 정규식 균형 그룹/재귀 일치
.net c# 정규식 균형 그룹/재귀 일치
균형 그룹/재귀 일치
여기에 소개된 균형 그룹 구문은 .Net Framework에서 지원되지 않습니다. 이 기능은 지원되어야 합니다. 그렇지 않으면 지원될 수 있지만 다른 구문을 사용합니다.
(100 * (50 + 15))과 같은 중첩 가능한 계층 구조를 일치시켜야 하는 경우가 있습니다. 이 경우 간단히 (.+)를 사용하면 가장 왼쪽의 왼쪽 대괄호와 가장 오른쪽 닫는 부분 사이의 내용만 일치합니다. 대괄호(여기서는 그리디 모드에 대해 논의하고 있으며, 게으른 모드에도 다음과 같은 문제가 있습니다). (5 / (3 + 2)))와 같이 원래 문자열에서 왼쪽 대괄호와 오른쪽 대괄호의 발생 횟수가 동일하지 않으면 일치 결과에서 두 대괄호의 수가 동일하지 않습니다. 그러한 문자열에서 대괄호 사이에 가장 길고 일치하는 내용을 일치시킬 수 있는 방법이 있습니까?
( 및 ( 머리가 완전히 혼란스러워지는 것을 방지하기 위해 둥근 괄호 대신 꺾쇠 괄호를 사용하겠습니다. 이제 우리의 질문은 다음과 같은 문자열에서 xx
여기에서는 다음 구문 구조를 사용해야 합니다.
(?'group') 캡처된 콘텐츠의 이름은 그룹입니다. 스택에 푸시됨(스택)
(?'-group') 스택에서 마지막으로 푸시된 그룹이라는 캡처된 콘텐츠를 팝합니다. 스택이 원래 비어 있으면 그룹의 일치가 실패합니다.
( ?(group)yes|no) 스택에 group이라는 캡처 콘텐츠가 있으면 표현식의 yes 부분을 계속 일치시키고, 그렇지 않으면 계속 no 부분을 일치시킵니다.
(?!) 여백 0 접미사 표현식이 없어 일치하려는 시도는 항상 실패합니다
프로그래머가 아닌 경우(또는 자신을 프로그래머라고 부르지만 스택이 무엇인지 모르는 경우) 위의 세 가지 구문을 다음과 같이 이해할 수 있습니다. 칠판에 '그룹'을 쓰는 것이고, 두 번째는 칠판에서 '그룹'을 지우는 것이고, 세 번째는 칠판에 '그룹'이 아직 쓰여 있는지 확인하고, 그렇다면 계속해서 일치하는 것이다. yes 부분. 그렇지 않으면 no 부분과 일치합니다.
우리가 해야 할 일은 왼쪽 괄호를 만날 때마다 "열기"를 누르고 오른쪽 괄호를 만날 때마다 팝업을 표시하는 것입니다. 비어 있는지 여부 - 비어 있지 않으면 오른쪽 괄호보다 왼쪽 괄호가 더 많아 정규식 엔진이 역추적(첫 번째 또는 마지막 문자 중 일부를 포기함)함을 의미합니다. 전체 표현식을 얻으려고합니다. ) #왼쪽 괄호를 만나면 칠판에 "Open"이라고 쓰세요
[^<>]* #왼쪽 괄호 일치 다음은 괄호의 내용이 아닙니다
) +
( # 오른쪽 괄호 뒤에 괄호가 아닌 내용 일치
)+
)*
(?(Open)(?!)) # 가장 바깥쪽 오른쪽 괄호를 만나기 전에 다른 것이 있는지 확인 지워지지 않은 칠판 "열기"가 있으면 일치가 실패합니다. 다음 예에서는 중첩된