regex
2014-10-03 2 views 0 likes 
0

구문 분석하려고하는 특정 프로토콜 을 구문 분석하는 정규식을 만들 수 있는지 궁금합니다.이 특정 프로토콜과 일치하는 정규식을 만드는 방법

다음은 규칙입니다.

  1. 데이터는 문자열로 제공됩니다.
  2. '='문자는 특별한 의미가 있습니다. 이스케이프하려면 = 따옴표 붙은 문자열에 "="과 같이 데이터에 ==가 포함될 수 있습니다. '='은 2-5 사이의 숫자 뒤에 경우
  3. 그것은 다음되는 데이터 채널 (2, 3, 4 또는 5)

예임을 나타낸다

    가정
  1. sdfasjfasdjfalksjdfaksjdflkajsdlfjasdf // 데이터는 "현재 채널 될
  2. = 2sjfksdjfaksjdfkasjdfk // = 2 채널 인 다음 어떤 2 ​​
  3. = 2sjdfaksdjf = 3sjfkasjdfk // 그 = 2 채널 2간에위한 다음 어떤 그 뒤에 오는 채널 3이다
  4. fsdfasjfhajsd = 2sfdjashdfjashfa = 5sfajsdfaksjdf 초기 부분 = 2 = 5 이스케이프 == 5
  5. 주 채널 인 다음 어떤 채널 2을위한 다음이든 현재 채널 위한 // 데이터의 일부로 이스케이프 된 것으로 간주되어야합니다.
  6. = 2 = x4 // = x4는 채널 2에 해당합니다. 즉, = 뒤에 숫자 2-5 만 오는 경우 있음을 의미합니다. 채널 스위치. 그렇지 않은 경우 데이터의 일부일뿐입니다.
  7. 특수한 경우는 =이 끝나는 문자열의 끝입니다. 이 경우 , 우리는 그래서 우리는 단지
+1

예. – Ryan

+0

반드시 프로토콜의 문자열과 일치하는 정규식이 있어야합니다. 나는 당신이 그것을 "분석"할 수 있는지 잘 모르겠다. 일부 확장은 그룹 캡처를 허용하지만 문자열에 많은 채널이있을 수 있으므로 클로저 내부에서 그룹을 캡처해야합니다. 그것이 가능한지 확실치 않은 부분입니다. – 1010

답변

0

당신은

를 사용할 수 있음을 의미 나중에 사용이 단지의 경우, 수신 버퍼에 저를 추가하기위한 것으로 을 계속해야 나중에 파이프를 내려오고 될 것입니다 무엇을 알 수 없습니다
/(?:=(?P<channel>[2-5])|^)(?P<data>(?:(?===)==|(?!=(?:[2-5]|\Z)).)*)/ms 

채널은 channel (있는 경우) 그룹에 속하고 나머지 채널은 data 그룹에 있습니다.

Demo.

설명 : 일반 언어처럼 들린다

(?: # first, match a "=" channel... 
    = 
    (?P<channel> 
     [2-5] 
    ) 
| #...or assert position at the start of the string 
    ^
) 
(?P<data> # next, capture the data in a group 
    (?: # repeat the following as often as possible: 
     (?= # if there's an escaped "=" ("=="), consume it 
      == 
     ) 
     == 
    | 
     (?! # otherwise, if... 
      = 
      (?: #...the next match doesn't start here... 
       [2-5] 
      | #...and the string doesn't end with "=" here... 
       \Z 
      ) 
     ) 
     . #...consume a single character 
    )* 
) 
관련 문제