2015-07-31 3 views
3

Поддерживает ли JExcript RegExp # exec() НЕ обрабатывать несколько результатов с помощью флага 'g'? Если нет, то каковы альтернативы?node.js RegExp не обрабатывает несколько совпадений с флагом 'g'?

У меня есть строка, как это:

a* 2 
b 3 
c* 4 

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

/\w+\*\s+(\d+)\n/g 

(т.е. она соответствует слову, за буквальным звездочкой и пропусками, за которым следует захвата группы цифр с последующим переводом строки, и имеет глобальный флаг включен).

В восхитительном https://regex101.com/#javascript, применяя строку в регулярное выражение возвращает два матча, как и ожидалось:

Match 1 
1. '2' 
Match 2 
1. '4' 

Но в Node.js, я получаю это:

> match = re.exec(str) 
> match 
[ 'a* 2\n', '2', index: 0, input: 'a* 2\nb 3\nc* 4\n' ] 

Оказывается матч объект не является многомерным, или, по крайней мере, он захватывает только первое совпадение.

Я пропустил что-то фундаментальное? И (как я спросил наверху) есть ли разумная альтернатива?

ответ

1

RegExp в JavaScript #exec() поддерживает множественное совпадение но не возвращает их сразу. Вы должны вызвать exec() несколько раз. Документы для этой функции в MDN объясняют эту проблему и приводят пример использования exec() для нескольких совпадений. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/exec#Examples

var myRe = /ab*/g; 
var str = 'abbcdefabh'; 
var myArray; 
while ((myArray = myRe.exec(str)) !== null) { 
    var msg = 'Found ' + myArray[0] + '. '; 
    msg += 'Next match starts at ' + myRe.lastIndex; 
    console.log(msg); 
} 
+0

Doh! Я полагаюсь на документы MDN - я не знаю, как я пропустил это. Это, безусловно, правильный ответ. Благодарю. –

0

Я собираюсь предварить этот ответ, говоря, что я очень мало знаю о Regex, но, я только что выполнил свое собственное тестирование и обнаружил, что этот вопрос может быть с \n в своем регулярном выражении.

Требование: \n означает, что в фрагменте, подобном тому, который вы опубликовали, если после c* 4 нет новой строки, эта строка не будет сопоставлена.

\w+\*\s+(\d+) работает только в соответствии с моими испытаниями на Regexr.

Как я уже сказал, я могу быть здесь на миле, но это только моя мысль.

Редактировать: Результаты моего тестирования:

/\w+\*\s+(\d+)\n/g 

a* 2 [MATCH] 
b 3 
c* 4 

И:

/\w+\*\s+(\d+)/g 

a* 2 [MATCH] 
b 3 
c* 4 [MATCH] 

Использование оригинала, но поставив новую строку после c:

/\w+\*\s+(\d+)\n/g 

a* 2 [MATCH] 
b 3 
c* 4 [MATCH] 
\n 
+2

Я ценю вашу преданность к обучению! Я не показывал конечную \ n на последней строке, но она есть. И обратите внимание, что я получил правильные результаты в regex101 (например, regexr). прагматики дали правильный ответ. –

+0

@fearless_fool А, я тогда научился чему-то новому!;) – Singular1ty

+2

Стыдно, что вы были опущены только для публикации того, что вы узнали. Но это закон джунглей StackOverflow, и, если честно, вы не решали суть вопроса: как вы обрабатываете несколько совпадений с помощью соответствия RegExp #? Но продолжайте учиться! –

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