2011-11-12 3 views
1

정규 표현식을 사용하여 ASPX 파일에서 특성 값을 찾아야합니다.ASPX 특성 정규식 구문 분석 C#

즉, 형식이 잘못된 HTML이나 HTML 관련 문제에 대해 걱정할 필요가 없습니다.

특정 속성 (LocText)의 값을 찾아야합니다. 따옴표 안에 무엇을 넣고 싶습니다. 값 내에 < % =, < %, < % $ 등의 ASPX 태그는이 속성에 적합하지 않으므로이 속성의 일부로 간주됩니다.

내가 이런 모습으로 시작 정규식 :

LocText="([^"]+)" 

이 좋은 작품, 결과 텍스트 첫 번째 그룹은, (& quot가 허용되지 않습니다 따옴표를 제외하고 모든 것을 얻는다; 대신 사용해야합니다.

그러나 ASPX 파일은 작은 따옴표를 사용할 수 있습니다. 두 번째 정규식을 적용해야합니다.

LocText='([^']+)' 

나는이 두 정규식을 사용할 수 있지만 연결 방법을 찾고 있습니다.

LocText=("([^"]+)"|'([^']+)') 

이것은 또한 작동하지만 매우 불필요한 그룹 수를 생성하므로 효율적이지 않습니다. 나는 이것이 backreferences를 사용하여 어떻게 든 할 수 있다고 생각하지만, 그것을 작동시킬 수는 없다.

LocText=(["']{1})([^\1]+)\1 

나는 이것에 의해, 내가 첫 번째 그룹에 단일/큰 따옴표를 저장하는 것이 생각하고 나는 그것이 첫 번째 그룹에있는 문자가 아닌 것은 읽을 말한다. 이것은 첫 번째 그룹의 인용구로 다시 둘러 쌉니다. 분명히, 나는 틀렸고 그런 식으로 작동하지 않습니다.

첫 번째 두 표현식을 함께 연결하는 방법이 있습니까? 하나의 그룹이 원하는 속성의 값인 최소량의 그룹을 만드는 방법이 있습니까? 단일/이중 인용 값에 대한 역 참조를 사용하는 것이 가능합니까? 아니면 완전히 그 의미를 잘못 이해 했습니까?

답변

2

나는 교대와 솔루션이 나쁘지 않다라고 말하고 싶지만,하지만 당신은 그래서 결과는 항상 같은 그룹의 가치를 찾을 수 named captures 사용할 수 있습니다

Regex regexObj = new Regex(@"LocText=(?:""(?<attr>[^""]+)""|'(?<attr>[^']+)')"); 
resultString = regexObj.Match(subjectString).Groups["attr"].Value; 

설명 :

LocText=   # Match LocText= 
(?:    # Either match 
"(?<attr>[^"]+)" # "...", capture in named group <attr> 
|     # or match 
'(?<attr>[^']+)' # '...', also capture in named group <attr> 
)     # End of alternation 

다른 옵션은 lookahead assertions을 사용하는 것입니다 ([^\1]은 문자 클래스 내에 역 참조를 넣을 수 없기 때문에 작동하지 않습니다. 그러나이를 둘러 볼 때 사용할 수 있습니다) :

Regex regexObj = new Regex(@"LocText=([""'])((?:(?!\1).)*)\1"); 
resultString = regexObj.Match(subjectString).Groups[2].Value; 

설명 :

LocText= # Match LocText= 
(["'])  # Match and capture (group 1) " or ' 
(   # Match and capture (group 2)... 
(?:  # Try to match... 
    (?!\1) # (unless it's the quote character we matched before) 
    .  # any character 
)*  # repeat any number of times 
)   # End of capturing group 2 
\1   # Match the previous quote character 
+0

작업하고 아름다운 솔루션, 감사합니다 만 :) – Mirek