2016-09-07 4 views
2

JavaScript에서 문자열을 구문 분석하고 모든 고유 단어를 찾으려고합니다. 기호로 시작합니다. 단어 새로운 라인을 기호를 이동 한 후 경우,RegEx 고유 한 단어 찾기

"test :one :one test :one test :two".match(/(:[A-z]\w+)(?!.*\1)/g) 

그리고 결과는 [':one', ':two']Online example #1

이다 그러나 :

/(:[A-z]\w+)(?!.*\1)/g 

그것은이 문자열을 잘 작동 :이 목적을 위해 정규 표현식 썼다

"test :one\n :one test :one test :two".match(/(:[A-z]\w+)(?!.*\1)/ig) 

정규식이 제대로 작동하지 않고 반환됩니다. [':one', ':one', ':two']Online example #2

이 정규 표현식을 수정하고 독특한 결과 만 얻는 방법?

+1

'[A-z]'vs'[A-Z]' – Tushar

+0

@Tushar, thx, 나는 이것을 고치겠다. – D0dger

답변

3

당신은 (Why is this regex allowing a caret? 참조) 검사가 문자열 (단지 선) 대신 [A-z][a-zA-Z]의 말대로 멀리 갈 수 있는지 확인하는 대신 .[\s\S]를 사용해야합니다 :

/(:[a-z]\w+)(?![\s\S]*\1)/gi 

regex demo

var re = /(:[a-z]\w+)(?![\s\S]*\1)/gi; 
 
var str = 'test :one\n :one test :one test :two'; 
 
console.log(str.match(re)); 
 
//or, get rid of the inital : 
 
console.log(str.match(re).map(function(x){return x.substr(1);}));

를 참조하십시오
+0

만약 필요하다면 첫 번째''''를 제거하기위한 또 다른 코드를 추가했다. 물론 그것은 내부 캡쳐 그룹으로 할 수 있으며'RegExp # exec'와 일치하는 것을 반복하지만 코드를 재사용하지 않는 것이 좋습니다. –

+0

예, 유용합니다. – D0dger