Я нашел очень похожие посты, но я не могу получить мое регулярное выражение прямо здесь.
Я пытаюсь написать регулярное выражение, которое возвращает строку, которая находится между двумя другими строками. Например: я хочу получить строку, которая находится между строками "корова" и "молоко".
Моя корова всегда дает молоко
вернется
"всегда дает"
Вот выражение, которое я сложил до сих пор:
(?=cow).*(?=milk)
Тем не менее, это возвращает строку «корова всегда дает».
Ответы:
Взгляд в будущее (эта
(?=
часть) не потребляет никакой информации. Это утверждение с нулевой шириной (как и проверка границ и просмотр за пределами).Вы хотите регулярный матч здесь, чтобы потреблять
cow
часть. Для захвата промежуточной части вы используете группу захвата (просто поместите часть шаблона, которую вы хотите захватить, в круглые скобки):Нет необходимости в взглядах.
источник
matched[1]
, а не весь сопоставленный текст сmatched[0]
.([\s\S]*?)
а не(.*?)
.Наиболее полное решение, которое будет работать в подавляющем большинстве случаев, - это использование группы захвата с ленивым шаблоном сопоставления точек . Тем не менее, точка
.
в регулярном выражении JavaScript не соответствует символам разрыва строки, поэтому в 100% случаев будет работать конструкция a[^]
или[\s\S]
/[\d\D]
/[\w\W]
.ECMAScript 2018 и более новые совместимые решения
В средах JavaScript, поддерживающих ECMAScript 2018 ,
s
модификатор позволяет.
сопоставлять любой символ, включая символы разрыва строки, а механизм регулярных выражений поддерживает вид сзади переменной длины. Таким образом, вы можете использовать регулярные выражения, такие какВ обоих случаях текущая позиция проверяется
cow
с любыми 1/0 или более пробелами послеcow
, затем любые 0+ символов, как можно меньше, сопоставляются и потребляются (= добавляются к значению соответствия), а затемmilk
проверяются на (с любым 1/0 или больше пробелов перед этой подстрокой).Сценарий 1: однострочный ввод
Этот и все другие сценарии ниже поддерживаются всеми средами JavaScript. Смотрите примеры использования в нижней части ответа.
cow
сначала определяется, затем пробел, затем любые 0+ символов, кроме символов разрыва строки, как можно меньше, чем*?
ленивый квантификатор, включаются в группу 1, а затем следует пробел сmilk
(и те, которые сопоставляются и потребляются , тоже ).Сценарий 2: многострочный ввод
Здесь
cow
и пробел сначала сопоставляется, затем любые 0+ символов, как можно меньше, сопоставляются и включаются в Группу 1, а затем пробел сmilk
сопоставляются.Сценарий 3: перекрывающиеся совпадения
Если у вас есть строка типа,
>>>15 text>>>67 text2>>>
и вам нужно получить 2 совпадения между>>>
+number
+whitespace
и>>>
, вы не можете использовать, так/>>>\d+\s(.*?)>>>/g
как вы найдете только 1 совпадение из-за того факта, что>>>
предыдущий67
уже используется при поиске первого совпадения. Вы можете использовать позитивный взгляд, чтобы проверить наличие текста без фактического «сожрания» его (т. Е. Добавления к совпадению):Смотрите онлайн регулярное выражение демо приносит
text1
иtext2
в группе найдено 1 содержание.Также смотрите Как получить все возможные совпадения для строки .
Вопросы производительности
Lazy dot match pattern (
.*?
) внутри шаблонов регулярных выражений может замедлить выполнение скрипта, если задан очень длинный ввод. Во многих случаях техника «развернуть петлю» помогает в большей степени. Пытаясь получить все междуcow
иmilk
из"Their\ncow\ngives\nmore\nmilk"
, мы видим, что нам просто нужно сопоставить все строки, которые не начинаются сmilk
, таким образом, вместо того,cow\n([\s\S]*?)\nmilk
чтобы использовать:Посмотрите демонстрацию regex (если возможно
\r\n
, используйте/cow\r?\n(.*(?:\r?\n(?!milk$).*)*)\r?\nmilk/gm
). С этой небольшой тестовой строкой прирост производительности незначителен, но при очень большом тексте вы почувствуете разницу (особенно если строки длинные, а разрывы строк не очень многочисленны).источник
Вот регулярное выражение, которое захватит то, что находится между коровой и молоком (без пробела в начале / конце):
Пример: http://jsfiddle.net/entropo/tkP74/
источник
.*
.*
нонгидаТам действительно не нужно смотреть вперед.
источник
Выбранный ответ не работает для меня ... хм ...
Просто добавьте пробел после коровы и / или перед молоком, чтобы урезать пробелы из "всегда дает"
источник
?<=
не поддерживается в Javascript.Я смог получить то, что мне было нужно, используя решение Мартино Фернандеса, приведенное ниже. Код является:
Вы заметите, что я оповещаю переменную testRE как массив. Это потому, что testRE по какой-то причине возвращается как массив. Выход из:
Изменения в:
источник
Просто используйте следующее регулярное выражение:
источник
?<=
не поддерживается в Javascript. Был бы способ сделать это все же.Я нахожу регулярное выражение утомительным и трудоемким, учитывая синтаксис. Поскольку вы уже используете javascript, без регулярных выражений сделать следующее проще:
источник
Если данные в несколько строк, то вам, возможно, придется использовать следующее,
Пример Regex 101
источник
Метод match () ищет в строке совпадение и возвращает объект Array.
источник
задача
Извлечь подстроку между двумя строками (исключая эти две строки)
Решение
источник