JavaScript에서 두 문자열 사이에 문자열을 가져 오는 정규식
대부분의 경우에 작동하는 가장 완벽한 솔루션 은 지연 도트 매칭 패턴이 있는 캡처 그룹 을 사용 하는 것입니다 . 그러나 .
JavaScript 정규식 의 점 은 줄 바꿈 문자와 일치하지 않으므로 100 %의 경우 작동하는 것은 [^]
또는 [\s\S]
/ [\d\D]
/ [\w\W]
구문입니다.
ECMAScript 2018 및 최신 호환 솔루션
ECMAScript 2018을 지원하는 JavaScript 환경 에서 s
수정자는 .
줄 바꿈 문자를 포함한 모든 문자를 일치 시킬 수 있으며 정규식 엔진은 가변 길이의 lookbehinds를 지원합니다. 따라서 정규 표현식을 사용할 수 있습니다
var result = s.match(/(?<=cow\s+).*?(?=\s+milk)/gs); // Returns multiple matches if any
// Or
var result = s.match(/(?<=cow\s*).*?(?=\s*milk)/gs); // Same but whitespaces are optional
두 경우 모두에서, 현재 위치에 대한 판정 cow
후 임의 1/0 이상의 공백으로 cow
그리고, 가능한 한 적은 수의 일치 및 소비 (= 매치 값에 첨가)되는 것에 따라 임의 0+ 문자를, 그리고 milk
어떤과 (검사되고 이 부분 문자열 앞의 1/0 이상의 공백).
시나리오 1 : 단일 라인 입력
이 시나리오와 아래의 다른 모든 시나리오는 모든 JavaScript 환경에서 지원됩니다. 답변 맨 아래에있는 사용 예를 참조하십시오.
cow (.*?) milk
cow
먼저 공간을 찾은 다음, 줄 바꿈 문자 이외의 0+ 문자는 가능한 한 적은 *?
게으른 수량 자로 그룹 1에 캡처 된 다음 공백이 milk
따라야합니다 (및 일치하고 소비 됨 ). ).
시나리오 2 : 여러 줄 입력
cow ([\s\S]*?) milk
여기서 cow
공백이 먼저 일치하면 가능한 한 적은 수의 0+ 문자가 일치하여 그룹 1에 캡처 된 다음 공백 milk
이 일치됩니다.
시나리오 3 : 겹치는 일치
같은 문자열을 가지고 있고 + + 와 >>>15 text>>>67 text2>>>
사이에 2 개의 일치 항목 을 가져와야하는 경우 첫 번째 일치 항목을 찾을 때 이전 이 이미 소비 되었기 때문에 1 개의 일치 항목 만 찾을 수 있으므로 사용할 수 없습니다 . 긍정적 인 미리보기 를 사용 하여 텍스트를 실제로 "고글 링"하지 않고 (예 : 일치 항목을 추가하지 않고) 텍스트 존재를 확인할 수 있습니다 .>>>
number
whitespace
>>>
/>>>\d+\s(.*?)>>>/g
>>>
67
/>>>\d+\s(.*?)(?=>>>)/g
참고 항목 온라인 정규식 데모가 항복 text1
하고 text2
그룹으로 한 내용이 발견했다.
또한 문자열에 대해 가능한 모든 겹치는 일치를 얻는 방법을 참조하십시오 .
성능 고려 사항
.*?
매우 긴 입력이 주어지면 정규식 패턴 내부의 게으른 점 일치 패턴 ( )이 스크립트 실행 속도를 늦출 수 있습니다. 대부분의 경우 루프 풀기 기술 이 더 큰 도움이됩니다. 사이 cow
와 milk
에서 모두를 얻으려고하면로 "Their\ncow\ngives\nmore\nmilk"
시작하지 않는 모든 줄을 일치시켜야 milk
하므로 대신 다음을 cow\n([\s\S]*?)\nmilk
사용할 수 있습니다.
/cow\n(.*(?:\n(?!milk$).*)*)\nmilk/gm
정규식 데모를 참조하십시오 (있는 경우 \r\n
사용 /cow\r?\n(.*(?:\r?\n(?!milk$).*)*)\r?\nmilk/gm
). 이 작은 테스트 문자열을 사용하면 성능 향상은 무시할 수 있지만 텍스트가 매우 크면 차이가 느껴집니다 (특히 줄이 길고 줄 바꿈이 많지 않은 경우).
JavaScript에서 샘플 정규식 사용법 :
//Single/First match expected: use no global modifier and access match[1]
console.log("My cow always gives milk".match(/cow (.*?) milk/)[1]);
// Multiple matches: get multiple matches with a global modifier and
// trim the results if length of leading/trailing delimiters is known
var s = "My cow always gives milk, thier cow also gives milk";
console.log(s.match(/cow (.*?) milk/g).map(function(x) {return x.substr(4,x.length-9);}));
//or use RegExp#exec inside a loop to collect all the Group 1 contents
var result = [], m, rx = /cow (.*?) milk/g;
while ((m=rx.exec(s)) !== null) {
result.push(m[1]);
}
console.log(result);
현대적인 String#matchAll
방법 사용
const s = "My cow always gives milk, thier cow also gives milk";
const matches = s.matchAll(/cow (.*?) milk/g);
console.log(Array.from(matches, x => x[1]));