Префикс без захвата Javascript RegEx

10

Я пытаюсь выполнить некоторую замену строки с помощью RegEx в Javascript. Сценарий представляет собой строку с одной строкой, содержащую длинный список номеров с разделителями-запятыми, в которых возможны дубликаты.

Пример строки: 272,2725,2726,272,2727,297,272 (конец может быть или не заканчиваться запятой)

В этом примере я пытаюсь сопоставить каждое вхождение всего числа 272. (ожидается 3 совпадения) Я пытаюсь использовать пример regex: (?:^|,)272(?=$|,)

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

Для чего стоит, если бы я использовал С#, есть синтаксис для сопоставления префикса, который делает то, что я хочу: (?<=^|,) Однако он не поддерживается в JavaScript.

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

  • 1
    Вы правы, JavaScript не поддерживает взгляд назад.
Теги:

2 ответа

15
Лучший ответ

Используйте границы слов:

\b272\b

гарантирует, что соответствует только 272, но не 2725.

(?:...) соответствует и не захватывает - но все, что он соответствует, будет частью общего соответствия.

A утверждение поиска, как (?=...), отличается: оно проверяет, возможно ли (или невозможно) совпадение с закрытым регулярным выражением на текущая точка, но она не добавляет общего соответствия.

  • 0
    Спасибо за быстрый ответ. Я думаю, что это будет работать .. Я попробую и вернусь, чтобы отметить как ответ. Кроме того, ваши комментарии о групповом поведении особенно полезны. Еще раз спасибо.
  • 0
    Наконец дошли руки до проверки, и это действительно сработало. Еще раз спасибо, Тим. Я упустил из виду тот факт, что \ b включает набор [0-9] вместо просто [az] [AZ]. Теперь я лучше понимаю поведение группирования.
2

Вот способ создать внешний вид JavaScript, который работал во всех случаях, в которых я нуждался.

Это пример. Можно сделать много более сложных и гибких вещей.

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

Этот пример предназначен для извлечения всех полей, окруженных фигурными скобками '{...}'. Скобки не возвращаются с полем.

Это просто пример, показывающий, что идея на работе не обязательно является прелюдией к приложению.

    function testGetSingleRepeatedCharacterInBraces()
      {
        var leadingHtmlSpaces = '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;' ;
        // 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
  • 2
    Это не делает то, что вы думаете, что делает. Опция \B(?={) Утверждает, что следующим символом является { , но этот символ должен соответствовать [0-9a-zA-Z_] чтобы удовлетворить остальное регулярное выражение. Ваш (?:\b|\B(?={)) Может быть просто \b , потому что второй вариант никогда не будет участвовать в матче.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню