[javascript] 여러 줄에 JavaScript 정규식을 사용하는 방법은 무엇입니까?

var ss= "<pre>aaaa\nbbb\nccc</pre>ddd";
var arr= ss.match( /<pre.*?<\/pre>/gm );
alert(arr);     // null

줄 바꿈 문자에 걸쳐 있지만 PRE 블록을 선택하고 싶습니다. 나는 ‘m’플래그가 그렇게한다고 생각했다. 하지 않습니다.

게시하기 전에 여기 에서 답변을 찾았습니다 . 나는 JavaScript를 알고 있다고 생각하고 (3 권의 책을 읽고, 근무 시간을 보았습니다) 기존 솔루션이 없었기 때문에 어쨌든 게시 할 수 있습니다. 여기에 돌을 던져

따라서 해결책은 다음과 같습니다.

var ss= "<pre>aaaa\nbbb\nccc</pre>ddd";
var arr= ss.match( /<pre[\s\S]*?<\/pre>/gm );
alert(arr);     // <pre>...</pre> :)

누구보다 덜 비밀스러운 방법이 있습니까?

편집 : 이것은 중복이지만 내 것보다 찾기가 어렵 기 때문에 제거하지 않습니다.

[^]“멀티 라인 도트”로 제안합니다 . 여전히 이해하지 못하는 것은 왜 [.\n]작동하지 않는 것입니다. 이것이 JavaScript의 슬픈 부분 중 하나 인 것 같습니다 ..



답변

[.\n].내부에 특별한 의미가 없기 때문에 작동하지 않습니다 . []단지 문자 그대로를 의미합니다 .. (.|\n)“줄 바꿈을 포함한 모든 문자”를 지정하는 방법입니다. 모든 줄 바꿈을 일치 시키려면 \rWindows 및 클래식 Mac OS 스타일 줄 끝을 포함 하도록 추가해야합니다 (.|[\r\n]).

밖으로 그 회전은 다소 성가신뿐만 아니라 느린 (참조로 할 수 있습니다 자세한 내용은 KrisWebDev의 답변을 ), 더 나은 접근 방식으로, 모든 공백 문자와 모든 공백이 아닌 문자와 일치하는 것입니다, 그래서 [\s\S]모든 것을 일치하고있다 것이다, 빠르고 더 간단합니다.

일반적으로 실제 HTML 태그와 일치시키기 위해 정규 표현식을 사용해서는 안됩니다. 예를 들어 이유에 대한 자세한 내용은 다음 질문 을 참조하십시오.

대신 실제로 jQuery를 사용하여 필요한 태그를 검색하십시오 (jQuery를 사용하면 더 쉽게 할 수 있지만 항상 document.getElementsByTagName("pre")표준 DOM으로 할 수 있습니다 ). 내용과 일치 해야하는 경우 정규 표현식으로 해당 결과의 텍스트 내용을 검색하십시오. .


답변

여러 줄 일치 (.|[\r\n])대신 사용하지 마십시오 ..

여러 줄 일치 [\s\S]대신 사용하십시오.

또한 *?또는 +?대신에 *또는 수량 자를 사용하여 필요하지 않은 경우 탐욕을 피하십시오 +. 이는 성능에 큰 영향을 줄 수 있습니다.

내가 만든 벤치 마크를 참조하십시오 : http://jsperf.com/javascript-multiline-regexp-workarounds

Using [^]: fastest
Using [\s\S]: 0.83% slower
Using (.|\r|\n): 96% slower
Using (.|[\r\n]): 96% slower

주의 : 당신은 또한 사용할 수 [^]있지만 아래 주석에서 더 이상 사용되지 않습니다.


답변

환경 및 Javascript (ECMAscript) 버전을 지정하지 않았으며이 게시물이 2009 년 이후 인 것을 알고 있습니다. 그러나 완전성을 위해 ECMA2018 릴리스에서는 이제 s플래그를 사용하여 .‘\ n’과 일치 시킬 수 있습니다. https를 참조 하십시오. : //stackoverflow.com/a/36006948/141801

그러므로:

let s = 'I am a string\nover several\nlines.';
console.log('String: "' + s + '".');

let r = /string.*several.*lines/s; // Note 's' modifier
console.log('Match? ' + r.test(s); // 'test' returns true

이것은 최근 추가 된 것으로 현재 많은 환경에서 작동하지 않습니다. 예를 들어 Node v8.7.0은 인식하지 못하지만 Chromium에서는 작동하며 Typescript 테스트에서 사용하고 있습니다. 시간이 지남에 따라 더 주류가 될 것입니다.


답변

[.\n]도트 인 [](정규식 정의에 의해; 자바 스크립트에만 해당되지 않음)은 도트 문자를 의미 하기 때문에 작동하지 않습니다 . 대신 (.|\n)(또는 (.|[\n\r]))를 사용할 수 있습니다 .


답변

점을 줄 바꿈과 일치하지 않기 때문에 점 ( )을 또는 로 변경하여 (Chrome) 테스트하고 나 (둘 다 [^][^\0])에서 작동했습니다 (여기 참조 :.[^\0][^]http://www.regular-expressions.info/dot.html ).

var ss= "<pre>aaaa\nbbb\nccc</pre>ddd";
var arr= ss.match( /<pre[^\0]*?<\/pre>/gm );
alert(arr);     //Working


답변

위에서 언급 한 예 외에도 대체 방법입니다.

^[\\w\\s]*$

\w단어와 \s공백은 어디에 있습니까?


답변