2012-12-25 2 views
3

나는 다음과 같은 데이터를 가지고 : 나는 반복적으로이 데이터를 분석하고 있고 는 블록 별도로 외부에이 개 변수를 일치시킬정규 표현식, 중괄호 외부 일치 문자 {}

int time="1356280261" 
char value="3000" 

bankLine { 
    char value="3000" 
    char currency="EUR" 
    int time="1356280261" 
} #bankLine 

.

는 나도 변수

/(?:char|int)\s*([A-z0-9]*)\s*=\s*"(.*)"/ 

아직, 정규식 블록 내부의 모든 항목을 일치 일치하도록이 정규식을해야합니까.

I 개별적으로 첫 번째 두 변수와 일치하고 bankLink 블록 안에 모두 무시할 수있는 방법

?

+0

구현 항목은 무엇입니까? PHP? 자바 스크립트? –

답변

3

그것은 조금 hackish하지만이처럼 부정적 예측을 추가하는 시도 할 수 있습니다 :

/(?:char|int)\s*([A-z0-9]*)\s*=\s*"(.*)"(?![^{]*\})/ 
             ^^^^^^^^^^^ 

이 모든 괄호 균형, 다행히 nestedness 문제가되지해야한다고 가정한다 (반면에 일반적는 것, 비슷한 질문이 있음) 바깥 쪽 대괄호를 찾고 있기 때문에

룩어이 관찰을 기반으로합니다 : 당신이 오픈 중괄호가 발생하지 않고 근접 중괄호가 발생하면, 우리가 합리적으로 우리가 중괄호한다고 가정 할 수도 있습니다.

뒤에 뒤에 음수 모양을 포함하도록 확장하려고하지만, 불행히도 대부분의 구현은 가변 길이 lookbehind를 지원하지 않습니다.

편집 : 아래 설명에서 설명하고있는 바와 같이

, 이러한 수정은 추천 :

/(?:char|int)\s*([A-Za-z0-9]*)\s*=\s*"([^"]*)"(?![^{]*\})/ 
        ^^^    ^^^^^ 
+0

+1하지만, 일치하지 않으려는 ASCII 문자 'Z'와 ASCII 문자 'a'사이에 문자가 아닌 문자가 있기 때문에 'A-z'를 'A-Za-z'로 변경했습니다. –

+0

@TimPietzcker - 고마워요, 팀. 방금 그 질문에서 정규 표현식을 붙여 넣어 차이점을 보여 주었지만 좋은 지적입니다. 나는 그의 질문도 편집 할 것이다. –

+0

좋은 아이디어. 또한,''(. *) '' '''''(''*'')''보다 낫겠지 만, 한 줄에 하나의 키/값 쌍이있는 것 같으므로 그 전체 모드는 그렇지 않습니다. –

0

이런 일이 당신을 위해 작동하는 경우를 참조하십시오 :

^(?:char|int)[^\n\r]*?$ 

아니면 그냥 넣어 표현식 앞에 ^이있는 경우

0

이것은 최선의 솔루션이 아닐 수도 있지만 나는이 귀하의 경우에 작동합니다 생각 :

/^(int|char).*$/ 

이유는 당신의 선언이 bankLine 블록 내부에 들여이다. 그게 우리가 여기에서 얻고있는 이점입니다. 우리는 처음에 공백이없는 int 또는 char로 시작하는 모든 행을 간단히 일치시킵니다.