2016-09-07 2 views
2

Я пытаюсь разобрать строку в JavaScript и найти все уникальные слова, которые начинаются с символа :. Я писал, что регулярное выражение для этой цели:RegEx найти уникальные слова

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

Он отлично работает для этой строки:

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

И результат [':one', ':two']Online example #1

Но, если после того, как слово идет новой линии символа

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

Regex не работает должным образом и возвращает [':one', ':one', ':two']Online example #2

Как изменить это регулярное выражение и получить уникальные результаты?

+1

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

+0

@Tushar, thx, я исправлю это – D0dger

ответ

3

Вы должны использовать [\s\S] вместо ., чтобы убедиться, что проверка может пойти до конца строки (не только строки) и [a-zA-Z] вместо [A-z] (см Why is this regex allowing a caret?):

/(:[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

На всякий случай: я добавил еще одну строку кода, чтобы избавиться от начального ':' s, если вам это нужно. Разумеется, это можно сделать с помощью внутренней группы захвата, а затем выполнить итерацию через совпадения с помощью «RegExp # exec», но почему бы не повторно использовать ваш код. –

+0

Да, это полезно – D0dger

Смежные вопросы