Возьмите это регулярное выражение: /^[^abc]/
. Это будет соответствовать любому отдельному символу в начале строки, кроме a, b или c.
Если вы добавите *
после него - /^[^abc]*/
регулярное выражение будет продолжать добавлять каждый последующий символ к результату, пока не встретит или a
, или b
, или c
.
Например, с исходной строкой "qwerty qwerty whatever abc hello"
выражение будет соответствовать до "qwerty qwerty wh"
.
Но что, если бы я хотел, чтобы совпадающая строка была "qwerty qwerty whatever "
... Другими словами, как я могу сопоставить все до (но не включая) точную последовательность "abc"
?
match but not including
?"qwerty qwerty whatever "
- не считая "abc". Другими словами, я не хочу, чтобы полученное совпадение было"qwerty qwerty whatever abc"
.do string.split('abc')[0]
. Конечно, не официальный ответ на эту проблему, но я нахожу это более простым, чем регулярное выражение.Ответы:
Вы не указали, какой тип регулярного выражения вы используете, но это будет работать в любом из самых популярных из них, которые можно считать «завершенными».
Как это работает
.+?
Часть является не-жадной версией.+
(одного или нескольких из ничего). Когда мы используем.+
, двигатель будет в основном соответствовать всем. Затем, если в регулярном выражении есть что-то еще, он пошагово вернется к следующей части. Это жадное поведение, означающее максимально удовлетворить .При использовании
.+?
вместо одновременного сопоставления всех и возврата к другим условиям (если таковые имеются), механизм будет сопоставлять следующие символы шаг за шагом, пока не будет сопоставлена следующая часть регулярного выражения (снова, если есть). Это не жадный , означающий совпадение наименьшего возможного для удовлетворения .После этого у нас есть , нулевая ширина утверждения , осмотреться . Эта сгруппированная конструкция совпадает с ее содержимым, но не считается совпадением символов ( нулевая ширина ). Возвращается только в случае совпадения или нет ( утверждение ).
(?=
{contents}
)
Таким образом, другими словами, регулярное выражение
/.+?(?=abc)/
означает:источник
.+?
а.*
?+
означает 1 или более, где*
означает 0 или более. Включение / исключение?
сделает его жадным или не жадным.^(?:(?!abc)(?!def).)*
цепочку, вы можете исключить шаблоны, которые вам не нужны, и он все равно будет захватывать все по мере необходимости, даже если шаблон не существуетЕсли вы хотите захватить все до «abc»:
Объяснение:
( )
захватить выражение внутри скобок для доступа с использованием$1
,$2
и т.д.^
совпадение начала строки.*
сопоставлять что-либо,?
не жадно (соответствует минимальное количество символов требуется) - [1][1] Причина, по которой это необходимо, заключается в том, что в противном случае в следующей строке:
по умолчанию регулярные выражения являются жадными , что означает, что они будут совпадать в максимально возможной степени. Поэтому
/^.*abc/
будет соответствовать «что угодно, что-то, что-то abc что-то». Добавление не жадного квантификатора?
заставляет регулярное выражение совпадать только «что угодно, что угодно».источник
sed
кажется, не поддерживает не жадное сопоставление, и при этом не поддерживает осмотр ((?=...)
). Что еще я могу сделать? Пример команды:echo "ONE: two,three, FOUR FIVE, six,seven" | sed -n -r "s/^ONE: (.+?), .*/\1/p"
возвращаетtwo,three, FOUR FIVE
, но я ожидаюtwo,three
...two
, а неtwo,three
.Как отметили @Jared Ng и @Issun, ключ для решения такого рода регулярных выражений, как «сопоставление всего до определенного слова или подстроки» или «сопоставление всего после определенного слова или подстроки», называется «косвенным» утверждением нулевой длины , Читайте больше о них, здесь.
В вашем конкретном случае это может быть решено положительным взглядом в будущее:
.+?(?=abc)
Одна картинка стоит тысячи слов. Смотрите подробное объяснение на скриншоте.
источник
.+?(?=abc)
копируемое регулярное выражение стоит больше.То, что вам нужно, это посмотреть на утверждение как
.+? (?=abc)
.См .: Взгляд вперед и взгляд назад.
Имейте
[abc]
в виду, что это не то же самое, чтоabc
. Внутри скобок это не строка - каждый символ - только одна из возможностей. За скобками он становится строкой.источник
Для регулярных выражений в Java, и я верю также в большинство движков регулярных выражений, если вы хотите включить последнюю часть, это будет работать:
Например, в этой строке:
выбрать все символы до "abc", а также включить abc
используя наше регулярное выражение, результат будет:
I have this very nice senabc
Проверьте это: https://regex101.com/r/mX51ru/1
источник
Я остановился на этом вопросе stackoverflow после поиска помощи, чтобы решить мою проблему, но не нашел ее решения :(
Поэтому мне пришлось импровизировать ... через некоторое время мне удалось найти необходимое мне регулярное выражение:
Как видите, мне нужно было до одной папки впереди папки «grp-bps», без учета последней черты. И требовалось иметь хотя бы одну папку после папки "grp-bps".
редактировать
Текстовая версия для копирования-вставки (измените «grp-bps» для вашего текста):
источник
Это будет иметь смысл о регулярных выражениях.
Здесь мы можем получить точное слово глобально, которое принадлежит внутри двойных кавычек. Например, если наш поисковый текст
Это пример для "двойных кавычек" слов
тогда мы получим «двойные кавычки» из этого предложения.
источник
"
, что мне кажется несущественным для вопроса.На питоне:
.+?(?=abc)
работает для однострочного случая.[^]+?(?=abc)
не работает, так как python не распознает [^] как правильное регулярное выражение. Чтобы обеспечить многострочное сопоставление, вам нужно использовать параметр re.DOTALL, например:источник
Я считаю, что вам нужны подвыражения. Если я правильно помню, вы можете использовать обычный
()
скобки для подвыражений.Эта часть из руководства grep:
Делать что-то вроде
^[^(abc)]
должно сделать свое дело.источник
В
$
помечает конец строки, так что - то , как это должно работать:[[^abc]*]$
где вы ищете что - нибудь не заканчивается в любой итерацииabc
, но она должна была бы быть в концеТакже, если вы используете язык сценариев с регулярным выражением (например, php или js), у них есть функция поиска, которая останавливается при первом обнаружении шаблона (и вы можете указать начало слева или начало справа, или с помощью php, Вы можете сделать взрыв, чтобы отразить строку).
источник
попробуй это
Запрос:
вывод :
источник