캡쳐 그룹과 함께 미리보기 문자열로 문자열을 분할 할 때 이상한 동작이 나타납니다..split(). 원래 (원래의 것보다 더 많은 문자를 반환하는 join()
때로는 원래 문자열보다 많은 문자가 나타납니다. 나는 그것이 가능하다고 생각하지 않을 것이다.
자바 스크립트JsFiddle
'ab'.split(/(?=b)/).join('');
'ab'.split(/(?=(?:b))/).join('');
'ab'.split(/(?=(b))/).join('');
'ab'
'ab'
'abb'
다른 lanaguages :
자바/스칼라
"ab".split("(?=b)").mkString
"ab".split("(?=(?:b))").mkString
"ab".split("(?=(b))").mkString
"ab"
"ab"
"ab"
PHP
implode(preg_split('/(?=b)/', 'ab'));
implode(preg_split('/(?=(?:b))/', 'ab'));
implode(preg_split('/(?=(b))/', 'ab'));
'ab'
'ab'
'ab'
왜 자바 스크립트는 세 번째 정규식의 원래 문자열보다 많은 문자를 사용합니까?
'ab'.split(%r{(?=b)}).join
'ab'.split(%r{(?=(?:b))}).join
'ab'.split(%r{(?=(b))}).join
'ab'
'ab'
'abb'
"그러나 모든 브라우저가이 기능을 지원하지는 않습니다." 비표준 브라우저입니까? –
@PaulDraper 정확한 알고리즘은 ECMAScript 사양의 [섹션 15.5.4.11] (http://www.ecma-international.org/ecma-262/5.1/#sec-15.5.4.14)에 정의되어 있습니다. –
@ PaulDraper 사양을 읽는 방식은 표준을 따르는 동작이며, 표준 편차를 벗어나는 경우 표준을 따르지 않습니다. Lookahead 어설 션은 [섹션 15.10.2.8 노트 2] (http://www.ecma-international.org/ecma-262/5.1/#sec-15.10.2.8)에 따라 '괄호 캡처'를 포함 할 수 있으므로 캡처 된 하위 문자열 LookAhead에 표시 되더라도 결과 배열에 포함되어야합니다. –