2017-03-08 1 views
0

내가 작업하고있는 백 엔드 프레임 워크가 오류를 던지고 필요한 경우 검색을 위해 배열에 이러한 오류를 저장하는지 알려주는 정규식을 작성해야합니다.오류 태그를 확인하는 자바 스크립트 정규식

문제는 오류에 대해 다른 태그를 사용한다는 것입니다.

{{error}}, <<error>>, [[error]], 그리고 일반적으로

<{:error:}>, 항상은 아니지만, 중괄호의 집합 후 올 것이다 다음과 같이 태그입니다. 중괄호 안에는 문자열이 있습니다. 오류에 대한 설명, 이상과 같이 오류에 대한 정보를 포함하는 JSON 문자열 중 하나 : 지금 현재로

<<error>> { Something has gone terribly wrong. } 
<<error>> { 
    {"some":"json"} 
} 
<{:error:}> { What went wrong? } 

는,이 같은, 오히려 비효율적이다 각각의 태그에 대해 특정 검사를 받고 있어요 :

error { Some description. } 

또는

:
if (string.indexOf('<<error>>') >= 0) 
    // Remove <<and>> 
if (string.indexOf('[[error]]') >= 0) 
    // Remove [[ and ]] 
// So forth... 

그럼,이 같은 문자열 왼쪽입니다

어느 대괄호 사이에 추출 할 정규식이 필요합니다. 이것은 내가 쓴 정규식 이었지만, 많은 것들에 못 미친다 :

string.match('/error\s?\{([^\}]+)\}/gi'); 

내가 말했듯이,이 절차는 매우 비효율적이고 문제가 있습니다.

먼저 error 이후의 중괄호는 선택 사항입니다. 그들은 선택적이어야합니다.

두 번째로 JSON이 닫는 것으로 표시 될 때 [^}]이 일치하지 않습니다. }입니다. 따라서 error의 여는 대괄호가 닫힐 때까지 세트의 모든 문자를 일치시키는 방법이 필요합니다. 이것이 가능한가?

+0

백엔드 처리를 수정하여 오류가 균일화되도록했습니다. 만약 당신이'(? : \ {\ {| <|) error (? : \} \} | >> | \] \] | 태그를 찾을 수 없다면 : \}>)'. – chris85

답변

1

첫 번째 대답에 대한 의견을 감안할 때 데이터를 한 줄 json으로 변환하기 위해이 정규식을 바꾸기 위해 정규식은 주석을 제거합니다. 제대로 레이블 된 오류로 시작하지 않는 개행을 제거합니다. 여러 줄이 켜져 있어야합니다.

  • (?:\/[\s\S*]*?\*\/|\/\/.*$|\s*^\s*(?!<<|{{|\[\[|<{:))) (demo)
  • 또는 (?:\s*^\s*(?!<<|{{|\[\[|<{:))는 포맷 문자열, 오류 정보를

을 제거하고 다음이 추출이 코멘트하지 않은 경우,이 정규식과 일치합니다.

({{error}}|<<error>>|\[\[error\]\]|<{:error:}>)[ \t]*(?:(.*)}\s*$)?demo


나는 그것을 기본적으로 사람이이 일을 발생할 수있는 문제를 설명 생각하는 그대로 다른 대답을 떠날거야.

+0

나는 그것들을 하나의 태그'[[error]]'와 모든 행에 통합했지만 모든 오류를 배열로 포착하는 정규 표현식을 얻을 수는 없다. https://jsfiddle.net/8e9Lfdjf/ – SISYN

+0

@ DanL 문제의 큰 부분은 {{첫 번째 정규식에서 { 나는 어떻게 든 그것을 놓쳤다. 그리고 우연히도 나의 데모에는 어떤 것도 없었다. ** 고정되어 있습니다. ** 이제는 모두 작동하는 것처럼 보입니다.** 별도로 ** 문자열에서 파생시키지 않고 단일 슬래시를 사용할 수 있다면 자바 스크립트에서 훨씬 많은 수의 정규 표현식을 작성할 수 있습니다. 마지막으로 this를 standardize_tags에 사용할 수 있으며 루프'({{error}} | <> \ [\ [error \] \] | <{:error:}>)'가 [[error]]'로 교체되지 않도록 할 수 있습니다. 사과, https://jsfiddle.net/8e9Lfdjf/5/ –

+0

양해 해 주셔서 감사합니다. – SISYN

1

좋은 질문입니다. 문제를 설명하고, 시도한 것을 보여주고, 충분한 사례를 제시했습니다.

정규식, 특히 JavaScript의 제한된 구현은 많은 언어 및 데이터 객체를 구문 분석하는 데 적합하지 않습니다. 그것은하지 않을 수 있습니다 (5 .*는 6 .*? 당신의 코드가 정말 예처럼 들여 쓰기를하는 경우, 그러나 4

{ 
{ 
{ 
} // 5 
} // 5 
} // 6 

에 가고 싶어에 가고 싶어 말을 캡처하는이 시나리오에서 어려울 수있다 즉 (이 ({{error}}|<<error>>|\[\[error\]\]|<{:error:}>)\s*(\s*{(.*?(?=$)|[\s\S]*?^)})? 같은 것을 사용 할 수 있어야한다,) 당신이 읽을 수 그것을 만드는 demo)

수 이것이하는 일은

  • 캡처 할 수 같은 줄에 {에서 }까지, 그렇지 않으면 2 단계로 넘어갑니다 (변경.
  • }이 행을 시작하는 한 {} 사이의 모든 것.

항상 }에 공백이있는 접두어가있는 경우 공백으로 정규식에 공백을 추가 할 수 있습니다.

({{error}}|<<error>>|\[\[error\]\]|<{:error:}>)\s*(\s*{(.*?(?=$)|[\s\S]*?^)})?` 
                     ^

}은 항상 개방 오류 마커와 같은 공간 같은 수의 접두어 경우,이 예를 들어이

([t ]*)({{error}}|<<error>>|\[\[error\]\]|<{:error:}>)(?:[ \t]*({(.*?(?=}$)|[\s\S]*?^\1)})?) (demo)

을 수행 할 수 있습니다, 그것은 보는 것이 중요 전체 샘플 들여 쓰기 텍스트. 어떻게 잘못 될 수 있는지 보여줍니다. 이 문제가 해결되지 않을 경우

, 당신은 더 많은 코드 중심의 솔루션이 필요합니다,하지만 적어도이

({{error}}|<<error>>|\[\[error\]\]|<{:error:}>)

와 오류의 존재를 감지 할 수 있습니다. Chris85의 단순한 버전은 나쁜 형태이며, <<error]]과 다른 조합 일 수도 있습니다. 아마도 그는 알고있을 것입니다.

+0

유체 반응 및 데모 주셔서 감사하지만 아직 질문이 있습니다. 항상 형식화되지는 않을 것입니다. 정확합니다. 공간이 전혀 없을 수도 있습니다. 공백없이이 예제를 사용할 수 없으며,'Message' 필드에 JSON을 표시 할 수 없습니다. – SISYN

+0

@DanL 님이 마지막 코멘트에 나를 태그하는 걸 잊었습니다. 당신이 그것을 보았다면 확실하지 않습니다. 문제가있는 의견으로 게시물을 수정할 수 있습니까? –

+0

나는 문제가있는이 바이올린에 댓글을 달았습니다. 내가하는 일을 더 효과적으로 볼 수 있다면 그것을 바꾸는 것이 자유 롭다. https://jsfiddle.net/3de9tLfz/ – SISYN