Regex Сопоставьте все символы между двумя строками

Пример: "Это просто простое предложение".

Я хочу сопоставить каждого символа между "Это" и "предложение". Разрывы строк следует игнорировать. Я не могу понять правильный синтаксис.

Ответ 1

Например

(?<=This is)(.*)(?=sentence)

Regexr

Я использовал lookbehind (?<=) и смотрю вперед (?=), чтобы "Это" и "предложение" не были включены в совпадение, но это зависит от вашего прецедента, вы также можете просто написать This is(.*)sentence.

Важно то, что вы активируете режим "dotall" вашего механизма регулярных выражений, чтобы . соответствовал новой строке. Но как вы это делаете, зависит от вашего двигателя регулярных выражений.

Следующее, если вы используете .* или .*?. Первый из них жадный и будет соответствовать последнему "предложению" в вашей строке, второй - ленив и будет соответствовать до следующего "предложения" в вашей строке.

Обновление

Regexr

This is(?s)(.*)sentence

Где (? s) включает модификатор dotall, делая . совпадающим с символами новой строки.

Обновление 2:

(?<=is \()(.*?)(?=\s*\))

соответствует вашему примеру "Это (простое) предложение". См. Здесь Regexr

Ответ 2

Требуется ленивый квантификатор

Воскрешая этот вопрос, потому что регулярное выражение в принятом ответе мне кажется не совсем правильным. Зачем? Поскольку

(?<=This is)(.*)(?=sentence)

будет соответствовать my first sentence. This is my second в This is my first sentence. This is my second sentence.

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

Вам нужен ленивый квантификатор между двумя поисковыми окнами. Добавление ? делает звезду ленивой.

Это соответствует тому, что вы хотите:

(?<=This is).*?(?=sentence)

См. демонстрацию. Я удалил группу захвата, которая не нужна.

Режим DOTALL для соответствия разрыву строк

Обратите внимание, что в демонстрации установлен режим "точка соответствует разрыву строки" (a.k.a.) dot-all (см. как включить DOTALL на разных языках). Во многих вариантах регулярных выражений вы можете установить его с помощью онлайн-модификатора (?s), превратив выражение в:

(?s)(?<=This is).*?(?=sentence)

Ссылка

Ответ 3

Попробуйте This is[\s\S]*sentence, работает в javascript

Ответ 4

Это:

This is (.*?) sentence

работает в javascript.

Ответ 5

используйте это: (?<=beginningstringname)(.*\n?)(?=endstringname)

Ответ 6

Вы можете просто использовать это: \This is .*? \sentence

Ответ 7

В случае, если кто-то ищет пример этого в контексте Jenkins. Он анализирует build.log и, если он находит совпадение, он завершает сборку с совпадением.

import java.util.regex.Matcher;
import java.util.regex.Pattern;

node{    
    stage("parse"){
        def file = readFile 'build.log'

        def regex = ~"(?s)(firstStringToUse(.*)secondStringToUse)"
        Matcher match = regex.matcher(file)
        match.find() {
            capturedText = match.group(1)
            error(capturedText)
        }
    }
}

Ответ 8

Возвышенный текст 3x

В возвышенном тексте вы просто пишете два слова, которые вы хотите сохранить, например, в вашем случае это

"Это" и "предложение"

а ты пишешь. * между

т.е. This is.* sentence

и это должно сделать тебя хорошо

Ответ 9

Вот как я это сделал:
Для меня это было проще, чем пытаться выяснить, какое именно выражение необходимо.

int indexPictureData = result.IndexOf("-PictureData:");
int indexIdentity = result.IndexOf("-Identity:");
string returnValue = result.Remove(indexPictureData + 13);
returnValue = returnValue + " [bytecoderemoved] " + result.Remove(0, indexIdentity); ' 

Ответ 10

для быстрого поиска в VIM вы можете использовать в приглашении Vim Control:/Это. *\_. * предложение

Ответ 11

Я попал сюда при поиске регулярного выражения для преобразования этого синтаксиса печати между print "string" в Python2 в старых сценариях с: print ("string") для Python3. Работает хорошо, в противном случае используйте 2to3.py для дополнительных преобразований. Вот мое решение для других:

Попробуйте это на Regexr.com (по какой-то причине не работает в NP++):

find:     (?<=print)( ')(.*)(')
replace: ('$2')

для переменных:

(?<=print)( )(.*)(\n)
('$2')\n

для метки и переменной:

(?<=print)( ')(.*)(',)(.*)(\n)
('$2',$4)\n

Как заменить всю строку "print" в Python2 на print ("string") для Python3?

Ответ 12

Это сработало для меня (я использую VS Code):

for: This is just\na simple sentence

Использование: This.+ sentence

Ответ 13

RegEx для сопоставления всего между двумя строками с использованием подхода Java.

List<String> results = new ArrayList<>(); //For storing results
String example = "Code will save the world";

Давайте использовать объекты Pattern и Matcher для использования RegEx (.?) *.

Pattern p = Pattern.compile("Code "(.*?)" world");   //java.util.regex.Pattern;
Matcher m = p.matcher(example);                      //java.util.regex.Matcher;

Поскольку Matcher может содержать более одного совпадения, нам нужно перебрать результаты и сохранить их.

while(m.find()){   //Loop through all matches
   results.add(m.group()); //Get value and store in collection.
}

Этот пример будет содержать только слово "сохранит", но в большем тексте он, вероятно, найдет больше совпадений.