2011-08-31 6 views
0

나는 자신을 더 잘 설명하려고 노력할 것이다 ;-).JavaScript RegExp 구문 질문

RegexBuddy를 사용하여 해결책을 찾으려고합니다. 대상은 Konfabulator 위젯의 JavaScript입니다.

I 파싱해야 할 문자열 :

서브 스트링 1)

1A1093/11 VALID: 1107140300 - 1108301500 
    DAILY 0300-1500 
    WIP 90M S OF RWY 08/26 AT E, W1, W2. 
    NO RESTRICTION DRG TKOF/LDG OR TAX. 

서브 스트링 2)

+++++++++++++++++++++ RUNWAY ++++++++++++++++++++++++++++++ 
1A1093/11 VALID: 1107140300 - 1108301500 
    DAILY 0300-1500 
    WIP 90M S OF RWY 08/26 AT E, W1, W2. 
    NO RESTRICTION DRG TKOF/LDG OR TAX. 
1A994/11 VALID: 1106201300 - 1112312059 
    PAPI RWY 08 NOT OPR WHEN ILS APCH IN USE. OPR WHEN VIS APCH IN 
    USE. 
1A987/11 VALID: 1106190615 - UFN 
    ILS DME RWY 08 BC 110.90MHZ CH46X OPR. 
+++ 

최종 결과는 다음 3 서브 스트링이어야

1A994/11 VALID: 1106201300 - 1112312059 
    PAPI RWY 08 NOT OPR WHEN ILS APCH IN USE. OPR WHEN VIS APCH IN 
    USE. 

하위 문자열 3)

1A987/11 VALID: 1106190615 - UFN 
    ILS DME RWY 08 BC 110.90MHZ CH46X OPR. 

각 섹션을 볼 수 있듯이이 비슷한 시작을 "1A987/11 VALID :"나는이 정규식 사용 찾는하고있는 :

[0-9A-Z]{3,6}/\d{2}\s{1,3}VALID: 

각 섹션로 끝을 은 "VALID 1A987/11 :"다음 섹션의 또는 "+++"이 정규식 사용하여 발견하고있는 : 사이입니다 [\ S \ S] +에

([0-9A-Z]{3,6}/\d{2}\s{1,3}VALID:)|(\+{3}) 

문자를? "." 어떤 이유로 작동하지 않습니다.

그래서 전체 정규식은 다음과 같습니다 문자열 1의 끝이 문자열 2의 시작이기 때문에

[0-9A-Z]{3,6}/\d{2}\s{1,3}VALID:[\s\S]+?(([0-9A-Z]{3,6}/\d{2}\\s{1,3}VALID:)|(\+{3})) 

지금, RegexBuddy는 1과 3이 발견 부분 문자열 2, 하위 문자열 찾지 않습니다.

나는 모든 하위 문자열을 찾는 방법을 찾고 있습니다. 따라서 각 하위 문자열의 끝을 찾고 문자열 자체에서 제외하는 방법을 찾고 있습니다.

+0

NOTAM 디코더 용입니까? –

답변

0

두 번째 유효 기간 : 100 % 확실하지는 않지만 정규 표현식의 두 번째 부분 인 "|" (또는) "UFN"사건을 포착하려는 것처럼 보이면 UFN을 포착하기위한 것이 누락 된 것 같습니다. 그 시퀀스에 대한 가능성의 전체 범위, 또는 당신이 사용하는 정규식의 구현을 모르겠지만 [AZ]로 대문자를 캡처하면 마지막 그룹이 필요합니다 ([AZ] {3 })를 사용하거나 플러스 대신 슬래시 뒤에 일반 영숫자 기호를 사용하십시오.

0

우리가 여기서 말하는 언어에 따라 다르지만 다음 일반 표현식은 줄 끝을 일반 문자로 처리하는 s 확장자가있는 펄에서 저에게 효과적이었습니다.

([0-9A-Z]{3,6}/\d{2}\s{1,3}VALID:.+?)([0-9A-Z]{3,6}/\d{2}\s{1,3}VALID:.+?)([0-9A-Z]{3,6}/\d{2}\s{1,3}VALID:.+?)(\+{3}) 

일부 VALID 섹션을 찾으려면 언어에 따라 루프를 수행해야합니다.

[0-9]|[A-Z][0-9A-Z]으로 줄이고 기본적으로 첫 번째 (...) 패턴을 3 번 복사했습니다.

+0

RegexBuddy에서 작동하지만 JavaScript로 작동하도록 관리하지 못했습니다. 나는 다른 방식으로 그것을 포기하고 해결했다. 모든 도움에 대해 10 배. – Erez

+0

+1 감사하겠습니다. – Gray

0

은 당신이 사용하고있는 정규식 파서 완전히 모르겠지만,이 짐승에게 샷을 제공 : 그것은 또는 당신을 위해 작동하지 않을 수도 있습니다, 그래서 그것은 긍정적 lookaheads를 사용

((?:(?:[0-9]|[A-Z]){3,6}/\d{2}\s{1,3}VALID:.+?)(?=(?: \+\+\+$|(?:[0-9]|[A-Z]){3,6}/\d{2}))) 

합니다.

편집 : 여기에 자바 스크립트에서 여러 줄 테스트입니다 :

var match, regex = /([0-9A-Z]{3,6}\/\d{2}\s{1,3}VALID:[\s\S]+?)(?=(?: \+{3}$|(?:[0-9A-Z]{3,6}\/\d{2})))/g; 
var s='+++++++++++++++++++++ RUNWAY ++++++++++++++++++++++++++++++\n\ 
1A1093/11 VALID: 1107140300 - 1108301500 \n\ 
    DAILY 0300-1500 \n\ 
    WIP 90M S OF RWY 08/26 AT E, W1, W2. \n\ 
    NO RESTRICTION DRG TKOF/LDG OR TAX. \n\ 
1A994/11 VALID: 1106201300 - 1112312059 \n\ 
    PAPI RWY 08 NOT OPR WHEN ILS APCH IN USE. OPR WHEN VIS APCH IN \n\ 
    USE. \n\ 
1A987/11 VALID: 1106190615 - UFN\n\ 
    ILS DME RWY 08 BC 110.90MHZ CH46X OPR. +++'; 

while (match=regex.exec(s)){ 
    alert(match[0]); 
} 
1

내가 질문을 읽어 방법, 중요한 사실은 다음과 같습니다

  1. 각 경기 두 개 이상의 라인을 포함하며,
  2. 첫 번째 줄의 시작 부분은 사용자가 지정한 패턴과 일치합니다.
  3. 각 줄은 공백으로 시작합니다. 여기

내가 정규식으로 그 표현 할 방법은 다음과 같습니다 나는 단지 수평에 맞게의 VALID: 이전과 이후의 라인의 시작 부분에 [ \t]+ 대신 \s+을 사용하는 방법

/^[A-Z0-9]{3,6}/[0-9]{2}[ \t]+VALID:.*(\r?\n[ \t]+.*)+/mg 

공지 사항 공백 문자 (공백 및/또는 탭). 그런 다음 줄 구분 기호 (DOS 스타일 \r\n 또는 유닉스 스타일 \n)와 일치 시키려면 \r?\n을 사용했습니다. 이렇게하면 정규식을 더 효율적으로 작성하고 작성하고 디버그하기가 더 쉽다.

끝에있는 mmultiline 모드를 켜기 때문에 ^ 앵커가 줄의 시작 부분에서 일치 할 수 있습니다. gglobal 모드를 사용하므로 첫 번째 패턴뿐만 아니라 모든 패턴을 찾을 수 있습니다.

그런데 . 대신 [\s\S]을 사용해야하는 이유는 대부분의 다른 정규 표현식과 마찬가지로 JavaScript에 "단선"또는 "DOTALL"모드가 없기 때문입니다. .을 캐리지 리턴 (\r) 또는 줄 바꿈 (\n)과 일치시킬 방법이 없습니다. 그러나 필자가 그랬듯이 라인 구분 기호를 명시 적으로 일치 시키면 처리 할 필요가없는 또 다른 문제입니다.