2012-07-15 4 views
2

배열처럼 보이는 문자열과 일치하는 정규식을 만들려고합니다. 시작과 끝 사용 같은 브래킷 (예 : (....} 괜찮) 경우문자열을 배열과 일치시키는 정규 표현식

  • 항목은
  • 문제가되지 않습니다
  • ], }, 또는 )로 끝나야합니다 [, { 또는
  • (로 시작해야 쉼표로 구분되어 있습니다.
  • 모든 공백 유형은 무시됩니다.
  • 빈 배열은 내가 처음 생각 해낸

을 접수 불행하게도이 빈 상태 (empty)의 배열을 허용하지 않습니다

'/\s*[\[|\{|\(]\s*\w+\s*[,\s*\w+]*\s*[\]|\}|\)]\s*/' 

했다. 그래서이 하나 빈 어레이를 허용 할뿐만 아니라 개구 브래킷 (예컨대 [, item, item]) 후 콤마 시작 배열을 허용 다른

'/\s*[\[|\{|\(][\s*\w+\s*]?[,\s*\w+]*\s*[\]|\}|\)]\s*/'` 

시도.

현재 내가하고있는 일은 두 개의 서로 다른 정규 표현식을 사용하여 하나 또는 다른 것이 일치하는지 확인하는 것입니다. 다른 정규 표현식은 앞에서 언급 한 첫 번째 정규 표현식과 유사하지만 여는 마커와 닫는 마커 사이에 0 개 이상의 공백 문자 만 허용합니다.

답변

3

나는 아래의 공백과 개행을 사용하여 명확하게 설명했다. 그것들은 제거되거나 그들을 무시하는 regex 옵션을 사용해야합니다. 나는 정규식을 이렇게 쉽게 개발할 수있다.

[\[\{\(] 
    \s* 
    (
    | 
     \w+\s* 
     (,\s*\w+\s*)* 
    ) 
[\]\}\)] 

이것은 테스트되지 않았지만 매우 근접해 있기를 바랍니다.

+0

어떤 이유에서 나는 괄호가 하위 패턴을 캡처하여 대안을 나열하는 데 사용할 수 있다는 사실을 알지 못하게한다는 사실을 알려줍니다. 마찬가지로 대괄호를 중첩시킬 수 있습니까? 아니면 대신 괄호를 사용하는 이유입니까? – Matt

+0

@Matt에 익숙한 모든 정규식 시스템에서 []은 [a-z0-9_]와 같은 범위에서만 사용됩니다. 그들은 둥지를 짓거나 집단화하지 않습니다.()는 산술 (1 + 2) * 3 대 1 + 2 * 3과 마찬가지로 캡처 및 연산자 순서를 수정하는 데 사용됩니다.()는 중첩 될 수 있습니다. 주어진 쌍의()의 캡처 부분은 종종 비활성화 될 수 있습니다 (예 : perl의 (? : expression)). – walrii

1

빈 배열을 특별한 경우로 처리하거나 이미 채워진 배열 정규 표현식으로 처리하십시오. 무언가 (테스트되지 않음) :

'(?:[\({[]\s*[\)}\]]|/\s*[\[|\{|\(]\s*\w+\s*[,\s*\w+]*\s*[\]|\}|\)]\s*)/' 
+0

어떻게 작동하는지 이해하는 데 문제가 있습니다. 좀 더 설명해 주시겠습니까? – Matt

관련 문제