В регулярном выражении соответствует либо концу строки, либо определенному символу
У меня есть строка. Конец другой, такой как 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
).