Javascript RegEx не захватывающий префикс
Я пытаюсь выполнить некоторую замену строки с помощью RegEx в Javascript. Сценарий представляет собой строку с одной строкой, содержащую длинный список номеров с разделителями-запятыми, в которых возможны дубликаты.
Пример строки: 272,2725,2726,272,2727,297,272
(конец может быть или не заканчиваться запятой)
В этом примере я пытаюсь сопоставить каждое вхождение всего числа 272. (ожидается 3 совпадения)
Я пытаюсь использовать пример regex: (?:^|,)272(?=$|,)
Проблема, с которой я столкнулась, состоит в том, что второй и третий совпадения включают в себя ведущую запятую, которую я не хочу. Я смущен, потому что думал, что (?:^|,)
будет соответствовать, но не будет захватывать. Может ли кто-нибудь пролить свет на это для меня? Интересный бит заключается в том, что конечная запятая исключена из результата, чего я хочу.
Для чего стоит, если бы я использовал С#, есть синтаксис для сопоставления префикса, который делает то, что я хочу: (?<=^|,)
Однако он не поддерживается в JavaScript.
Наконец, я знаю, что могу обойти это, используя разделение строк, манипулирование массивами и воссоединение, но я хочу узнать.
Ответы
Ответ 1
Используйте границы слов:
\b272\b
гарантирует, что соответствует только 272
, но не 2725
.
(?:...)
соответствует и не захватывает - но все, что он соответствует, будет частью общего соответствия.
A утверждение поиска, как (?=...)
, отличается: оно проверяет, возможно ли (или невозможно) совпадение с закрытым регулярным выражением на текущая точка, но она не добавляет общего соответствия.
Ответ 2
Вот способ создать внешний вид JavaScript, который работал во всех случаях, в которых я нуждался.
Это пример. Можно сделать много более сложных и гибких вещей.
Главное, что в некоторых случаях, можно создать неподдерживающий префикс RegExp (заглянуть) в JavaScript.
Этот пример предназначен для извлечения всех полей, окруженных фигурными скобками '{...}'.
Скобки не возвращаются с полем.
Это просто пример, показывающий, что идея на работе не обязательно является прелюдией к приложению.
function testGetSingleRepeatedCharacterInBraces()
{
var leadingHtmlSpaces = ' ' ;
// The '(?:\b|\B(?={))' acts as a prefix non-capturing group.
// That is, this works (?:\b|\B(?=WhateverYouLike))
var regex = /(?:\b|\B(?={))(([0-9a-zA-Z_])\2{4})(?=})/g ;
var string = '' ;
string = 'Message has no fields' ;
document.write( 'String => "' + string
+ '"<br>' + leadingHtmlSpaces + 'fields => '
+ getMatchingFields( string, regex )
+ '<br>' ) ;
string = '{LLLLL}Message {11111}{22222} {ffffff}abc def{EEEEE} {_____} {4444} {666666} {55555}' ;
document.write( 'String => "' + string
+ '"<br>' + leadingHtmlSpaces + 'fields => '
+ getMatchingFields( string, regex )
+ '<br>' ) ;
} ;
function getMatchingFields( stringToSearch, regex )
{
var matches = stringToSearch.match( regex ) ;
return matches ? matches : [] ;
} ;
Output:
String => "Message has no fields"
fields =>
String => "{LLLLL}Message {11111}{22222} {ffffff}abc def{EEEEE} {_____} {4444} {666666} {55555}"
fields => LLLLL,11111,22222,EEEEE,_____,55555