2013-09-25 7 views
0

У меня есть строка, из которой я должен извлечь имя пользователя и идентификатор.Заменить все в JavaScript Regex

This is a string which has a @[User Full Name](contact:1) data inside. 

Чтобы получить имя пользователя и идентификатор контакта из строки выше, я использую этот шаблон регулярного выражения.

var re = /\@\[(.*)\]\(contact\:(\d+)\)/; 
    text = text.replace(re,"username:$1 with ID: $2"); 
// result == username: User Full Name with ID: 1 

Он теперь работает проблема, у меня есть несколько имен пользователей в строке, я попытался с помощью/г (глобальный), но его не заменить должным образом: Пример строки:

This is a string which has a @[User Full Name](contact:1) data inside. and it can also contain many other users data like @[Second Username](contact:2) and @[Third username](contact:3) and so many others.... 

при использовании глобальной я получаю этот результат:

var re = /\@\[(.*)\]\(contact\:(\d+)\)/g; 
text = text.replace(re,"username:$1 with ID: $2"); 
//RESULT from above  
This is a string which has a user username; User Full Name](contact:1) data inside. and it can also contain many other users data like @[[Second Username](contact:2) and @[Third username and ID: 52 and so many others.... 

ответ

2

Вам просто нужно нон жадный ? матч в вашей первой группе захвата. Имея .*, вы соответствуете наибольшей возможной сумме, в то время как если вы используете .*?, она соответствует наименьшему возможному количеству.

/@\[(.*?)\]\(contact:(\d+)\)/ 

И если слово контакт не всегда есть, вы могли бы сделать ..

/@\[(.*?)\]\([^:]+:(\d+)\)/ 

См working demo

+0

Upvoted для удивительного демо-сайта :) – thefourtheye

+0

Почему вы отводящее '@'? – Phil

0

Не могу сказать, что я могу видеть, как будет ваша результирующая строка для использования. Как о чем-то вроде этого ...

var re = /@\[(.*?)\]\(contact:(\d+)\)/g; 
var users = []; 
var match = re.exec(text); 
while (match !== null) { 
    users.push({ 
     username: match[1], 
     id: match[2] 
    }); 
    match = re.exec(text); 
} 
+0

Спасибо, Фил ... информативный, но на самом деле я разбираю эти строковые данные из базы данных, чтобы просмотреть для пользователя, поэтому в этом месте нет смысла .... :) Еще раз спасибо. – user969068

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