>  기사  >  백엔드 개발  >  .net C# 정규식 균형 그룹/재귀 일치

.net C# 정규식 균형 그룹/재귀 일치

巴扎黑
巴扎黑원래의
2016-12-19 16:32:111585검색

.net c# 정규식 균형 그룹/재귀 일치

균형 그룹/재귀 일치

여기에 소개된 균형 그룹 구문은 .Net Framework에서 지원되지 않습니다. 이 기능은 지원되어야 합니다. 그렇지 않으면 지원될 수 있지만 다른 구문을 사용합니다.

(100 * (50 + 15))과 같은 중첩 가능한 계층 구조를 일치시켜야 하는 경우가 있습니다. 이 경우 간단히 (.+)를 사용하면 가장 왼쪽의 왼쪽 대괄호와 가장 오른쪽 닫는 부분 사이의 내용만 일치합니다. 대괄호(여기서는 그리디 모드에 대해 논의하고 있으며, 게으른 모드에도 다음과 같은 문제가 있습니다). (5 / (3 + 2)))와 같이 원래 문자열에서 왼쪽 대괄호와 오른쪽 대괄호의 발생 횟수가 동일하지 않으면 일치 결과에서 두 대괄호의 수가 동일하지 않습니다. 그러한 문자열에서 대괄호 사이에 가장 길고 일치하는 내용을 일치시킬 수 있는 방법이 있습니까?

( 및 ( 머리가 완전히 혼란스러워지는 것을 방지하기 위해 둥근 괄호 대신 꺾쇠 괄호를 사용하겠습니다. 이제 우리의 질문은 다음과 같은 문자열에서 xx 를 어떻게 바꾸는지에 관한 것입니다. aa> yy, 가장 긴 쌍의 꺾쇠 괄호 안에 있는 콘텐츠를 캡처하는 방법은 무엇입니까?

여기에서는 다음 구문 구조를 사용해야 합니다.

(?'group') 캡처된 콘텐츠의 이름은 그룹입니다. 스택에 푸시됨(스택)
(?'-group') 스택에서 마지막으로 푸시된 그룹이라는 캡처된 콘텐츠를 팝합니다. 스택이 원래 비어 있으면 그룹의 일치가 실패합니다.
( ?(group)yes|no) 스택에 group이라는 캡처 콘텐츠가 있으면 표현식의 yes 부분을 계속 일치시키고, 그렇지 않으면 계속 no 부분을 일치시킵니다.
(?!) 여백 0 접미사 표현식이 없어 일치하려는 시도는 항상 실패합니다
프로그래머가 아닌 경우(또는 자신을 프로그래머라고 부르지만 스택이 무엇인지 모르는 경우) 위의 세 가지 구문을 다음과 같이 이해할 수 있습니다. 칠판에 '그룹'을 쓰는 것이고, 두 번째는 칠판에서 '그룹'을 지우는 것이고, 세 번째는 칠판에 '그룹'이 아직 쓰여 있는지 확인하고, 그렇다면 계속해서 일치하는 것이다. yes 부분. 그렇지 않으면 no 부분과 일치합니다.

우리가 해야 할 일은 왼쪽 괄호를 만날 때마다 "열기"를 누르고 오른쪽 괄호를 만날 때마다 팝업을 표시하는 것입니다. 비어 있는지 여부 - 비어 있지 않으면 오른쪽 괄호보다 왼쪽 괄호가 더 많아 정규식 엔진이 역추적(첫 번째 또는 마지막 문자 중 일부를 포기함)함을 의미합니다. 전체 표현식을 얻으려고합니다. ) #왼쪽 괄호를 만나면 칠판에 "Open"이라고 쓰세요
[^<>]* #왼쪽 괄호 일치 다음은 괄호의 내용이 아닙니다
) +
( # 오른쪽 괄호 뒤에 괄호가 아닌 내용 일치
)+
)*
(?(Open)(?!)) # 가장 바깥쪽 오른쪽 괄호를 만나기 전에 다른 것이 있는지 확인 지워지지 않은 칠판 "열기"가 있으면 일치가 실패합니다. 다음 예에서는 중첩된

태그를 일치시킬 수 있습니다. 🎜>]*>[^<>] *(((?'열기']*>)[^] *)+)*(?(열기)(?!))

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.