2015-10-20 3 views
1

Я пытаюсь захватить 1 или 2 части информации. При использовании regexr это показывает, что мое выражение работает и захватывается как должно, но при его запуске оно захватывается только из одной строки (с теми же данными, что и в regexr) и возвращает null для остальных.Группы захвата регулярных выражений Javascript не работают

Я пытался строить выражение here

И при переходе на JS вкус он показывает, захватив группу не работает с помощью цветных накладок, но это показывает, что они правильно работают в боковой панели. Даже самая простая группа захвата, похоже, не работает.

Что мне не хватает?

Input является:

<@U0BUPU9QQ> 49 
50 
<@U0BUPU9QQ> 
<@U0BUPU9QQ> noget 49 noget andet tekst 5 40 
<@U0BUPU9QQ> noget andet tekst 5 40 
<@U0BUPU9QQ|mn> has joined the channel 

Выход:

Должно быть ID внутри <> (за исключением @) и последняя группа цифр в строке, если нет ID, то только цифры.

+0

Каков ожидаемый вход и выход? – vks

+0

использовать .exec и петлю. – YOU

+0

При использовании генератора кода от regex101, я получаю что-то вроде того, что вы описываете. Он по-прежнему производит «неправильный» вывод. –

ответ

1

Не обращайте внимания на группы подсветки regex101 для JS: если вы видите их в правой части экрана MATCH INFORMATION, они соответствуют и фиксируются правильно.

В JS, вот код, который будет получать группы захвата (обратите внимание, что m[1] является первым текстом группы захвата, m[2] является вторым текстом группы и т.д.):

var re = /^(?:<@([A-Z0-9]+)>)?.*\b([0-9]+)/gm; 
 
var str = '<@U0BUPU9QQ> 49\n50\n<@U0BUPU9QQ>\n<@U0BUPU9QQ> noget 49 noget andet tekst 5 40\n<@U0BUPU9QQ> noget andet tekst 5 40\n<@U0BUPU9QQ|mn> has joined the channel'; 
 
var m; 
 
    
 
while ((m = re.exec(str)) !== null) { 
 
    document.write(m[1] + "<br/>" + m[2] + "<br/><br/>"); 
 
}

Заметки о самом регулярном выражении:

  • ^ - Начать сопрягая в начале линия (за счет m модификатора)
  • (?:<@([A-Z0-9]+)>)? - необязательный (из-за ? квантификатором) группы соответствия
    • <@ - буквенные <@ символы
    • ([A-Z0-9]+) - (Захват группа 1) 1 или более буквенно-цифровые символы
    • > - закрытие угловой кронштейн
  • .* - 0 или более символов с другом чем символ новой строки (как можно больше)
  • \b([0-9]+) - (Захват группы 2) 1 или более цифр, которые предшествуют словом границы

Вы можете настроить регулярное выражение в соответствии с вашими требованиями. Прямо сейчас он будет соответствовать идентификатору (= ​​символы внутри необязательного номера <@...>) и последняя последовательность цифр на линии. Если вам нужна первая цифра , используйте ленивое совпадение .*? вместо жадного (.*).

+0

_if там нет идентификатора, а затем только цифры. Это должно быть: '^ (?: <@ ([A-Z0-9] +)>) *. *? \ b ([0-9] +) ' – hjpotter92

+0

Ну, я не уверен, что здесь требуется точное регулярное выражение. Я добавил объяснение. –

+0

Используя шаблон из @ hjpotter92 вместе с вашим кодом, он, наконец, работает по назначению. Спасибо вам всем. –