В регулярном выражении соответствует либо концу строки, либо определенному символу

У меня есть строка. Конец другой, такой как index.php?test=1&list=UL или же index.php?list=UL&more=1, Единственное, что я ищу, это &list=,

Как я могу сопоставить его, находится ли он в середине строки или в конце? Пока у меня есть [&|\?]list=.*?([&|$]), но ([&|$]) часть на самом деле не работает; Я пытаюсь использовать это, чтобы соответствовать & или конец строки, но конец части строки не работает, поэтому этот шаблон соответствует второму примеру, но не первому.

2 ответа

Решение

Использование:

/(&|\?)list=.*?(&|$)/

Обратите внимание, что когда вы используете выражение в скобках, каждый символ в нем (за некоторыми исключениями) будет интерпретироваться буквально. Другими словами, [&|$] соответствует персонажам &, |, а также $,

Короче

Любые утверждения нулевой ширины внутри [...] потерять там смысл утверждения нулевой ширины. [\b] не совпадает с границей слова (совпадает с пробелом или в POSIX, \ или же b), [$] соответствует буквальному $ голец, [^] это либо ошибка, либо, как в регулярном выражении ECMAScript, любой символ. То же самое с \z, \Z, \A якоря.

Вы можете решить проблему, используя любой из следующих шаблонов:

[&?]list=([^&]*)
[&?]list=(.*?)(?=&|$)
[&?]list=(.*?)(?![^&])

Соответствие между последовательностью символов и одним символом или концом строки (текущий сценарий)

.*?([YOUR_SINGLE_CHAR_DELIMITER(S)]|$) pattern ( предложенный João Silva) довольно неэффективен, так как механизм регулярных выражений сначала проверяет шаблоны, которые появляются справа от шаблона lazy dot, и только если они не совпадают, он "расширяет" шаблон lazy dot.

В этих случаях рекомендуется использовать отрицательный символьный класс (или выражение в скобках в разговоре POSIX):

[&?]list=([^&]*)

Смотрите демо. подробности

  • [&?] - положительный класс персонажа, соответствующий либо & или же ? (обратите внимание, что отношения между символами / диапазонами символов в классе символов являются отношениями ИЛИ)
  • list= - подстрока, последовательность символов
  • ([^&]*) - Группа захвата № 1: ноль или более (*) отличные от & ([^&]) как можно больше

Проверка наличия конечного одиночного разделителя символов без возврата его или конца строки

Большинство разновидностей регулярных выражений (включая JavaScript, начинающийся с ECMAScript 2018) поддерживают обходные пути, конструкции, которые возвращают true или false, только если шаблоны соответствуют или нет. Они имеют решающее значение в том случае, если ожидаются последовательные совпадения, которые могут начинаться и заканчиваться одним и тем же символом (см. Исходный шаблон, он может соответствовать строке, начинающейся и заканчивающейся &). Хотя это не ожидается в строке запроса, это общий сценарий.

В этом случае вы можете использовать два подхода:

  • Позитивный взгляд с чередованием, содержащим класс позитивных символов: (?=[SINGLE_CHAR_DELIMITER(S)]|$)
  • Отрицательный взгляд с классом отрицательных символов: (?![^SINGLE_CHAR_DELIMITER(S)])

Решение с отрицательной перспективой немного более эффективно, потому что оно не содержит альтернативной группы, которая добавляет сложности в процедуру сопоставления. ОП решение будет выглядеть так

[&?]list=(.*?)(?=&|$)

или же

[&?]list=(.*?)(?![^&])

Смотрите эту демонстрацию регулярных выражений и еще одну здесь.

Конечно, в случае, когда конечные разделители являются многоканальными последовательностями, будет работать только положительное прогнозное решение, поскольку [^yes] не отменяет последовательность символов, но символы внутри класса (т.е. [^yes] соответствует любому символу, но y, e а также s).

Другие вопросы по тегам