2013-08-27 14 views
0

태그 집합으로 일부 텍스트를 구문 분석하고 바꿉니다. 예를 들어, 텍스트를 **surrounded by double astersks**으로 굵게으로 만들려면 패턴에 /\*\*([\s\S]+?)\*\*/gm을 사용하고 대체에는 "<b>$1</b>"을 사용합니다. 그러나 내가이 질문에서했던 것처럼 원시 텍스트도 제공하고 싶습니다. 그래서 Regex BBcode : 특수 태그의 모든 태그를 무시 (이스케이프) (JavaScript)

예 "백틱 더블 별표 사이에서 (선택) 문자/공백/뉴 라인과 역 따옴표로 둘러싸인 공백 및 이중 별표로 둘러싸인 줄 바꿈하지만 포함한 모든 문자와 일치"표현이 필요합니다.

입력 문자열 : "Lorem ``ipsum **dolor** sit`` amet, **consectetur** adipisicing elit"

결과 : "로렘 입숨 ** 슬픔 ** AMET, consectetur adipisicing ELIT 앉아"

내가 그룹과 lookaheads 일치하지 않는하지만 아무 소용을 위해 노력했다. 예를 들어 html 엔티티로 문자를 대체하거나 Markdown 파서를 사용하여이 작업을 수행 할 수 있다는 것을 알고 있지만 관심을 얻기 위해 순수 Regex 마법을 통해이 작업을 수행 할 수 있습니까?

+0

"Lorem"** ipsum ** dolor ** sit'' amet, ** consectetur ** adipisicing elit "'. 'ipsum ** dolor ** sit'이 backticks로 둘러싸여 있기 때문에 Dolor가 굵게 표시되어서는 안됩니다. ** conectetur **는 표현과 일치하고 검은 색이되는 반면 이중 백틱을 사용하여 이스케이프합니다. – Juribiyan

답변

0

수명은 lookbehind 어설 션으로 더 간단합니다.

((`)[\s\S]*?)? #capture any characters (or none) preceded by a backtick (captured for a later use in the RE). Optionnal - non-greedy. 
\*\*([\s\S]+?)\*\* #capture any characters surrounded by asterisks. 
([\s\S]*?\2) #capture any characters (including empty string) followed by the capture #2 (empty or backtick). 

첫 번째 그룹이 비어있는 경우

/((`)[\s\S]*?)?\*\*([\s\S]+?)\*\*([\s\S]*?\2)/gm 

는, 마지막 하나는 빈 문자열을 일치합니다.

그런 다음 결과를 필터링합니다.

var str = "Lorem `ipsum **dolor** sit` amet, **consectetur** adipisicing elit dolor `**sit amet**` adi"; 

str = str.replace(/((`)[\s\S]*?)?\*\*([\s\S]+?)\*\*([\s\S]*?\2)/gm, function(m, p1, p2, p3, p4){ 
    return p1 && p4 ? m : "<b>" + p3 + "</b>"; 
}); 

return p1 && p4 ? m : "<b>" + p3 + "</b>"; 

p1 경우 p4 우리의 대응되는 문자열 시작을 의미하고, 역 따옴표로 끝이 정의되지 않은/빈 없습니다. 우리는 변화없이 그것을 돌려 보낸다.

이 예제의 출력 :

LOREM`ipsum의 ** 슬픔은 ** sit`는 AMET, consectetur adipisicing ELIT 슬픔은`** AMET 앉아 **`ADI는

그것은이다 조금 까다 롭다. 그러나 당신이 지적한대로, 그것은 단지 관심사를 위해서입니다. ;)