2013-12-17 7 views
2

Я хочу построить регулярное выражение JavaScript для соответствия всем словам, начинающимся с «ad» или «ae», или ко всем словам, которые содержат «-ad» и «-ae».Регулярные выражения в JavaScript: совпадение нескольких подстрок в начале строки?

Это то, что я пробовал:

var regex_string = "^[ad|ae]|-[ad|ae]"; 
var re = RegExp(regex_string, "i"); 

var matches = _.filter(data, function(r) { 
    if (re.test(r)) { 
    return true; 
    } 
}); 

Однако это соответствие все слова, начинающиеся с «а», «D» или «е».

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

JSFiddle здесь: http://jsfiddle.net/xGgan/1/

+0

Использование регулярных выражений литералов – SLaks

ответ

3

Поскольку [] это соответствует любой букве внутри Так он говорит: «Совпадение или d или | или а или е». Вместо этого вам нужно использовать группу захвата с помощью или.

Попробуйте

var regex_string = "(^(ad|ae)|-(ad|ae))"; 
3

[ ... ] обозначает класс символов, и все, что внутри будет соответствовать независимо от положения. Кроме того, [ae] соответствует только одному символу, либо a, либо e.

Для что вы делаете, переводя его непосредственно даст:

(?:^(?:ad|ae)|-(?:ad|ae)) 

используется | в группах ((...) для групп захвата и (?: ...) для групп без захвата, последний предпочтительнее, если вы не собираетесь для сохранения захватов для последующего использования, поскольку они улучшают скорость регулярного выражения и мудрую память).

Но это может быть оптимизирован немного:

(?:^|-)a[ed] 

должен соответствовать так же, как хорошо.

0

Вот моя интерпретация "-п.в И -ad":

/^(?:ad|ae)|-ad.*-ae|-ae.*-ad/ 
Смежные вопросы