Соответствующий символ регулярного выражения в подстроке и исключая символы конца [duplicate]

Вначале ширина сначала ищет родных братьев. Сначала глубина сначала сначала ищет детей. Поэтому, я думаю, это будет зависеть от того, какой поиск вы хотите делать. поиск типов отношений по полям, вероятно, будет использоваться для bfs, где иерархические (деревья, папки, ранги и т. д.) будут более подходящими как dfs.

17
задан Gary 23 August 2012 в 01:44
поделиться

2 ответа

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

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

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

36
ответ дан João Silva 16 August 2018 в 10:08
поделиться
  • 1
    Благодаря; "интерпретируется буквально" часть I не знала о квадратных скобках. Очень полезно! Итак, для использования | для разделения двух или более символов требуется ()? – Gary 23 August 2012 в 01:57
  • 2
    Да, действительно, вам нужно сгруппировать (()) альтернативы. – João Silva 23 August 2012 в 02:05
  • 3
  • 4
    @DrazenBjelovuk Вы, вероятно, имели в виду 'SomeText/blahblah'.match(/Some([^\/]*)/)[1] (с выходом Text в качестве вывода). См. мой ответ , каждое решение содержит группу захвата , которая фиксирует требуемое подгрузочное сообщение, которое вы обычно получаете в качестве первой группы после возвращения совпадения. – Wiktor Stribiżew 4 July 2018 в 20:20
  • 5
    @ WiktorStribiżew В Hindsight, кажется, я имел в виду string.match(/Some.*?(\/|$)/)[0];. Не знаю, что на данный момент, хотя LOL. – Drazen Bjelovuk 4 July 2018 в 20:33

Короче

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

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

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

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

Паттерн .*?([YOUR_SINGLE_CHAR_DELIMITER(S)]|$), предложенный Жоау Силвой ) довольно неэффективен, так как механизм регулярных выражений проверяет шаблоны, которые появляются справа от шаблона ленивых точек, и только если они не совпадают, он «расширяет» шаблон ленивого точечного изображения.

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

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

См. демонстрацию . Подробности

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

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

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

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

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

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

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

или

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

. См. эту демонстрацию regex и другую здесь .

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

0
ответ дан Wiktor Stribiżew 16 August 2018 в 10:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: