programing

JavaScript regex를 여러 줄에 걸쳐 사용하는 방법

procenter 2022. 9. 28. 22:22
반응형

JavaScript regex를 여러 줄에 걸쳐 사용하는 방법

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

PRE 블록이 줄바꿈 문자 위에 걸쳐져 있어도 픽업해 주었으면 합니다.난 'm' 깃발이면 되는 줄 알았어.하지 않다.

글을 올리기 전에 여기에서 을 찾았습니다.자바스크립트(책 3권, 작업시간)를 알고 있다고 생각했지만 SO에는 기존 솔루션이 없었기 때문에 어쨌든 투고하겠습니다.여기에 돌을 던지다

해결책은 다음과 같습니다.

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

좀 덜 신비로운 방법은 없나요?

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

그것은 제안합니다.[^]"복수선 점"으로 표시됩니다.내가 아직도 이해할 수 없는 것은 왜[.\n]동작하지 않습니다.이것이 자바스크립트의 슬픈 부분 중 하나라고 생각합니다.

사용하지 않다(.|[\r\n])대신.멀티 라인 매칭에 사용합니다.

사용[\s\S]대신.멀티라인 매칭용

또한 필요 없는 곳에 욕심을 내지 않도록 한다.*?또는+?대신 정량자*또는+이는 퍼포먼스에 큰 영향을 미칠 수 있습니다.

작성한 벤치마크를 참조하십시오.https://jsben.ch/R4Hxu

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

다음 번호:[^]단, 아래 코멘트에서는 권장되지 않습니다.

[.\n]동작하지 않는 이유는.속에 특별한 의미가 없다[]문자 그대로의 의미일 뿐입니다...(.|\n)"newline을 포함한 임의의 문자"를 지정할 수 있습니다.모든 줄바꿈을 일치시키려면 다음을 추가해야 합니다.\rWindows 및 클래식한 Mac OS 스타일의 라인 엔딩을 포함합니다.(.|[\r\n]).

이것은 다소 번거롭고 느린 것으로 판명되었습니다(자세한 내용은 KrisWebDev의 답변 참조).따라서 더 나은 접근법은 모든 공백 문자와 공백이 아닌 모든 문자를 매칭하는 것입니다.[\s\S]모든 것에 대응하고, 보다 빠르고 심플합니다.

일반적으로 실제 HTML 태그와 일치시키기 위해 regexp를 사용하지 마십시오.그 이유에 대한 자세한 내용은 예를 들어 다음 질문을 참조하십시오.

대신 필요한 태그를 실제로 DOM에서 검색해 보십시오(jQuery를 사용하면 쉽게 검색할 수 있지만 언제든지 검색 가능).document.getElementsByTagName("pre")표준 DOM)을 사용하여 검색한 후 내용과 일치해야 할 경우 regexp를 사용하여 결과의 텍스트 내용을 검색합니다.

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

이것은 최근 추가된 것으로 현재 많은 환경에서는 동작하지 않습니다.예를 들어 노드 v8.7.0은 이를 인식하지 못하는 것처럼 보이지만 크롬에서는 동작합니다.그리고 제가 쓰고 있는 타입스크립트 테스트에서 사용하고 있으며 시간이 지남에 따라 더욱 주류화 될 것으로 예상됩니다.

[.\n]동작하지 않는다, 왜냐하면 점 찍기 때문이다[](regex 정의에 따라 javascript에만 해당되지 않음)는 닷 문자를 의미합니다.사용할 수 있습니다.(.|\n)(또는(.|[\n\r]))을 클릭합니다.

이제 s(단일 행) 수식자가 있습니다.이 수식자는 도트가 새로운 행과 일치하도록 합니다:)\s도 새로운 행과 일치합니다.d

슬래시 뒤에 s만 추가해 주세요.

 /<pre>.*?<\/pre>/gms

테스트(Crome)를 실시해 본 결과, 동작하고 있습니다(양쪽 모두).[^]그리고.[^\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공백 공간용

[\\w\\s]*

이것은 저에게 도움이 될 뿐만 아니라, 특히 새로운 행을 포함한 여러 항목을 매칭하는 데 있어서, 다른 모든 답변은 모든 일치 항목을 하나로 묶는 데 그쳤습니다.

언급URL : https://stackoverflow.com/questions/1979884/how-to-use-javascript-regex-over-multiple-lines

반응형