2010-01-29 2 views
4

가장자리를 약간 밀었지만 다음 정규 표현식 (")"이있는 상황이 있습니다. 문자열을 문자열로 분할하는 데 사용되는 경우 [ ] 배열을 사용하면 결과가 나에게 다소 이상합니다.빈 그룹 "()"이있는 정규 표현식이 이상한 결과를 반환합니다

string[] res = new Regex("()").Split("hi!"); 

세트 res 9 가능한 요소들의 어레이 (!) : 예 코드의 라인 "!"[ "", "", "H", "", "I", "", , "", ""]

나는 [h "," ","i "," ","! " ]. 이 특별한 결과가 필요한 이유는 다른 regexp 라이브러리와의 호환성을위한 것입니다 ...

정규 표현식 개체 또는 일부 인코딩 문제 또는 이와 유사한 일부 옵션이 없기 때문에이 문제가 발생할 수 있습니까? 아니면 그것은 어떤 방식으로 결정되며 확실히 작동해야하는 올바른 방법입니까? 또한 두 번째 (예상) 결과를 반환하도록 강제하는 방법이 있습니까?

+1

당신이 그런 기괴한 정규식을 사용하도록 강제하는 호환성 문제를 명확히 수 있을까? –

+0

+1 정말 재미있는, 아마도 쓸모없는 질문입니다! –

+0

내가 이것을 파고 들기 시작한 이유는 Ruby 정규 표현식이 작동하는 방식과 호환되도록 만드는 것입니다. 특히 IronRuby의 스펙 중 하나를 통과 시키십시오. .NET에서의 구현이 더 정확한 것 같지만 ... –

답변

3

가 문자 : "|h|i|!|"

스플릿은 인접한 두 개의 일치 항목 사이 또는 문자열 시작과 첫 번째 일치 사이 또는 마지막 일치와 문자열 끝 사이의 요소를 모두 포함하는 배열을 반환합니다. 문자열에서 발생한 순서대로 반환합니다. 그 결과는 다음과 같습니다. ["","h","i","!",""]

이렇게하면 9 개의 배열 요소 중 5 개가 설명됩니다.

그러나 "캡처 괄호가 Regex.Split 식에 사용되는 경우 캡쳐 된 텍스트가 결과 문자열 배열에 포함됩니다." (msdn에서 직접 인용, 여기 : http://msdn.microsoft.com/en-us/library/ze12yx1d.aspx)

이 경우 캡처 된 텍스트는 빈 문자열입니다. 우리는 4 경기가 있었기 때문에 결과에서 다른 4 가지 요소를 설명합니다.

따라서, 전체 결과는 다음과 같습니다 ["","","h","","i","","!","",""]

+0

감사합니다. Tim, 무슨 일이 일어나고 있는지 조명 해줍니다. –

+0

반갑습니다. 다행히 도울 수있어. –

3

식이 "h"와 "!"앞에 일치하기 때문에 9 개의 요소가 정확하다고 말하고 싶습니다.

는 처음에 일치를 방지하거나 빈 일치 주위에 더 많은 문자가 있는지 확인 내다/뒤에 추가 할 수 종료하려면 : 나는 |를 사용하여 정규식 일치합니다 위치를 표시 한 "(?<=.)()(?=.)"

+0

Lookahead/Behind를 가져 주셔서 감사합니다. 그것은 그것이 내가 원하는 방식으로 작동하게합니다. –

관련 문제