2014-04-04 3 views
3

캡쳐 그룹과 함께 미리보기 문자열로 문자열을 분할 할 때 이상한 동작이 나타납니다..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' 

답변

0

그것은 자바 스크립트 넣어 때문입니다 :

루비 같은 일을 나타납니다 : 나는 크롬, 파이어 폭스, 오페라, 그리고 IE (11)


편집 이것을 재현 분할 결과에서 자동으로 그룹을 캡처합니다. MDN 가입일

4

는 :

separator 캡처 괄호를 포함하는 정규 표현이면마다 separator 일치하고, 캡처 괄호 (정의되지 않은 결과를 포함 함) 결과가 출력 배열로 연결된다.

그래서 당신은이 같은도 내다보기에 캡처 그룹을,이 때

결과는 이전과 일치하는 위치 후 ab, 문자열의 두 부분이 포함됩니다
'ab'.split(/(?=(b))/) 

lookahead이지만 lookahead 내의 그룹과 일치하는 문자열의 부분도 포함합니다 (b).

그러나, MDN 기사는 지적에 간다 :

그러나, 모든 브라우저가이 기능을 지원하지.

그래서이 동작이 모든 브라우저에서 일관 될 것으로 기대하지는 않습니다.

+0

"그러나 모든 브라우저가이 기능을 지원하지는 않습니다." 비표준 브라우저입니까? –

+0

@PaulDraper 정확한 알고리즘은 ECMAScript 사양의 [섹션 15.5.4.11] (http://www.ecma-international.org/ecma-262/5.1/#sec-15.5.4.14)에 정의되어 있습니다. –

+0

@ PaulDraper 사양을 읽는 방식은 표준을 따르는 동작이며, 표준 편차를 벗어나는 경우 표준을 따르지 않습니다. Lookahead 어설 션은 [섹션 15.10.2.8 노트 2] (http://www.ecma-international.org/ecma-262/5.1/#sec-15.10.2.8)에 따라 '괄호 캡처'를 포함 할 수 있으므로 캡처 된 하위 문자열 LookAhead에 표시 되더라도 결과 배열에 포함되어야합니다. –

관련 문제