Регулярное выражение, чтобы получить строку между двумя строками в Javascript

Я нашел очень похожие посты, но я не совсем понимаю, что такое регулярное выражение.

Я пытаюсь написать регулярное выражение, которое возвращает строку между двумя другими строками. Например: я хочу получить строку, которая находится между строками "корова" и "молоко"

  

Моя корова всегда дает молоко

вернется

  

"всегда дает"

Вот выражение, которое я сложил до сих пор:

(?=cow).*(?=milk)

Однако это возвращает строку "корова всегда дает"

118 голосов | спросил phil 13 AMpWed, 13 Apr 2011 02:20:50 +040020Wednesday 2011, 02:20:50

7 ответов


0

Предварительный просмотр (эта часть (?=) не потребляет никакого ввода. Это утверждение нулевой ширины (как и проверка границ и просмотр за пределами).

Вы хотите регулярное совпадение здесь, чтобы использовать часть cow. Для захвата промежуточной части вы используете группу захвата (просто поместите часть шаблона, которую вы хотите захватить, в круглые скобки):

 cow(.*)milk

Нет необходимости в предварительном просмотре.

ответил R. Martinho Fernandes 13 AMpWed, 13 Apr 2011 02:23:08 +040023Wednesday 2011, 02:23:08
0

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

srctext = "My cow always gives milk.";
var re = /(.*cow\s+)(.*)(\s+milk.*)/;
var newtext = srctext.replace(re, "$2");

Пример: http://jsfiddle.net/entropo/tkP74/

ответил entropo 13 AMpWed, 13 Apr 2011 02:47:52 +040047Wednesday 2011, 02:47:52
0
  

Регулярное выражение для получения строки между двумя строками в Javascript

Наиболее полное решение, которое будет работать в подавляющем большинстве случаев, - это использование группы захвата с шаблоном сопоставления ленивых точек . Однако точка . в регулярном выражении JS не соответствует символам разрыва строки, поэтому в 100% случаев будет работать [^] или [\s\S] /[\d\D] /[\w\W].

ECMAScript 2018 и более новые совместимые решения

В средах JS, поддерживающих ECMAScript 2018 , модификатор s позволяет ., чтобы соответствовать любому символу, включая символы разрыва строки, и механизм регулярных выражений поддерживает просмотр за разной длиной. Таким образом, вы можете использовать регулярное выражение, как

var result = s.match(/(?<=cow\s+).*?(?=\s+milk)/gs); // Returns multiple matches if any
// Or
var result = s.match(/(?<=cow\s*).*?(?=\s*milk)/gs); // Same but whitespaces are optional

В обоих случаях текущая позиция проверяется на наличие cow с любыми 1/0 или более пробелами после cow, затем любые 0+ символов, как можно меньше, сопоставляются и потребляются (= добавляются к значению соответствия), а затем milk проверяется на наличие любых пробелов 1/0 или более перед этой подстрокой.

Сценарий 1: однострочный ввод

Этот и все другие нижеприведенные сценарии поддерживаются всеми средами JS. См. Примеры использования в нижней части ответа.

cow (.*?) milk
Сначала определяется

cow, затем пробел, затем любые 0+ символов, кроме символов перевода строки, как можно меньше, чем ---- +: = 13 =: + ---- - это ленивый квантификатор, заносится в группу 1 и затем пробел с *? должно следовать (и они совпадают и потребляются тоже).

Сценарий 2: многострочный ввод

milk

Здесь cow ([\s\S]*?) milk и пробел сначала сопоставляются, затем любые 0+ символов, как можно меньше, сопоставляются и включаются в группу 1. , а затем пробел с cow.

Сценарий 3: перекрывающиеся совпадения

Если у вас есть строка типа milk, и вам нужно получить 2 совпадения между >>>15 text>>>67 text2>>> + >>> + number и whitespace, вы не можете использовать >>> , поскольку при этом будет найдено только 1 совпадение />>>\d+\s(.*?)>>>/g перед >>> уже потребляется при поиске первого совпадения. Вы можете использовать позитивный взгляд , чтобы проверить наличие текста фактически не "поглощая" его (т.е. добавляя к совпадению):

67

См. демонстрацию онлайн-регулярных выражений , в результате />>>\d+\s(.*?)(?=>>>)/g и text1 при обнаружении содержимого группы 1.

Также см. Как получить все возможные совпадения совпадений для строки .

Вопросы производительности

Шаблон сопоставления отложенных точек (text2) внутри шаблонов регулярных выражений может замедлить выполнение сценария, если задан очень длинный ввод. Во многих случаях метод развертывания цикла помогает в большей степени. Попытка получить все между .*? и cow из milk мы видим, что нам просто нужно сопоставить все строки, которые не начинаются с "Their\ncow\ngives\nmore\nmilk", таким образом, вместо milk мы можем использовать:

cow\n([\s\S]*?)\nmilk

См. демонстрационную версию regex (если есть /cow\n(.*(?:\n(?!milk$).*)*)\nmilk/gm , используйте \r\n). С этой небольшой тестовой строкой прирост производительности незначителен, но при очень большом тексте вы почувствуете разницу (особенно если строки длинные, а разрывы строк не очень многочисленны).

  

Пример использования регулярного выражения в JavaScript:

     

 /cow\r?\n(.*(?:\r?\n(?!milk$).*)*)\r?\nmilk/gm
ответил Wiktor Stribiżew 24 42016vEurope/Moscow11bEurope/MoscowThu, 24 Nov 2016 12:36:58 +0300 2016, 12:36:58
0

Я смог получить то, что мне было нужно, используя решение Мартино Фернандеса, приведенное ниже. Код:

var test = "My cow always gives milk";

var testRE = test.match("cow(.*)milk");
alert(testRE[1]);

Вы заметите, что я оповещаю переменную testRE как массив. Это потому, что testRE по какой-то причине возвращается как массив. Выход из:

My cow always gives milk

Изменяется на:

always gives
ответил phil 20 J000000Thursday17 2017, 23:38:17
0

Как насчет просто использования следующего регулярного выражения:

(?<=My cow\s).*?(?=\smilk)
ответил Brandon 20 +03002016-10-20T12:01:23+03:00312016bEurope/MoscowThu, 20 Oct 2016 12:01:23 +0300 2016, 12:01:23
0

Выбранный ответ мне не помог ... хм ...

Просто добавьте пробел после коровы и /или перед молоком, чтобы обрезать пробелы из "всегда дает"

/(?<=cow ).*(?= milk)/

 введите описание изображения здесь

ответил duduwe 19 PMpThu, 19 Apr 2018 16:48:35 +030048Thursday 2018, 16:48:35
0

Метод match () ищет в строке совпадение и возвращает объект Array.

// Original string
var str = "My cow always gives milk";

// Using index [0] would return<br/>
// "**cow always gives milk**"
str.match(/cow(.*)milk/)**[0]**


// Using index **[1]** would return
// "**always gives**"
str.match(/cow(.*)milk/)[1]
ответил Marc Antoni 12 J0000006Europe/Moscow 2018, 06:48:08

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

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132