2014-02-18 3 views
0

Это мое регулярное выражение:Что не так с этим регулярным выражением:/(?: (?:^| S) hide _ ([^ s] +)) + /?

/(?:(?:^|\s)hide_([^\s]+))+/ 

Например, когда у меня есть эта строка:

hide_test sgadsg hide_ asdg hide_some_more asdgasd 

он должен соответствовать test и some_more. В настоящее время он возвращает hide_test и test. Кто-нибудь знает, что не так с этим регулярным выражением?

ответ

3

Без g флаг, он возвращает только первый матч.

'hide_test sgadsg hide_ asdg hide_some_more asdgasd'.match(
    /(?:(?:^|\s)hide_([^\s]+))+/ 
) 
// => ["hide_test", "test"] 

Установка g флаг даст вам все матчи, (все совпавшие строки):

'hide_test sgadsg hide_ asdg hide_some_more asdgasd'.match(
    /(?:(?:^|\s)hide_([^\s]+))+/g 
) 
// => ["hide_test", " hide_some_more"] 

Чтобы получить только часть после hide_, необходимо постобработке возвращаемого значения.

Например, при использовании map с дополнительной заменой:

'hide_test sgadsg hide_ asdg hide_some_more asdgasd'.match(
    /(?:(?:^|\s)hide_([^\s]+))+/g 
).map(function(match) { 
    return match.replace(/^\s*hide_/, ''); 
}) 

Кстати, регулярное выражение может быть уменьшено до: /(\bhide_\S+)+/g (без учета захвата)

+0

спасибо! как я могу позволить ему возвращать только то, что приходит после hide_? – Jonan

+0

@ Джонан, я добавил эту часть в ответ. Проверьте это. – falsetru

2

Если вы хотите выхода test и some_more, вам нужно использовать .exec и цикл:

var regex = /(?:\bhide_(\S+))+/g; 
var s = 'hide_test sgadsg hide_ asdg hide_some_more asdgasd'; 
var match, matches=[]; 

while ((match=regex.exec(s)) !== null) { 
    matches.push(match[1]); 
} 

alert(matches); 

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

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