Вначале ширина сначала ищет родных братьев. Сначала глубина сначала сначала ищет детей. Поэтому, я думаю, это будет зависеть от того, какой поиск вы хотите делать. поиск типов отношений по полям, вероятно, будет использоваться для bfs, где иерархические (деревья, папки, ранги и т. д.) будут более подходящими как dfs.
Использование:
/(&|\?)list=.*?(&|$)/
Обратите внимание, что при использовании выражения скобки каждый символ внутри него (с некоторыми некоторыми исключениями] будет интерпретироваться буквально. Другими словами, [&|$]
соответствует символам &
, |
и $
.
Любые утверждения нулевой ширины внутри [...]
теряют смысл утверждения с нулевой шириной. [\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
).
|
для разделения двух или более символов требуется()
? – Gary 23 August 2012 в 01:57()
) альтернативы. – João Silva 23 August 2012 в 02:05'SomeText/blahblah'.match(/Some([^\/]*)/)[1]
(с выходомText
в качестве вывода). См. мой ответ , каждое решение содержит группу захвата i>, которая фиксирует требуемое подгрузочное сообщение, которое вы обычно получаете в качестве первой группы после возвращения совпадения. – Wiktor Stribiżew 4 July 2018 в 20:20string.match(/Some.*?(\/|$)/)[0];
. Не знаю, что на данный момент, хотя LOL. – Drazen Bjelovuk 4 July 2018 в 20:33