Regex Совпадение всех символов между двумя строками - PullRequest
349 голосов
/ 24 мая 2011

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

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

Ответы [ 13 ]

516 голосов
/ 24 мая 2011

Например

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

RegExr

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

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

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

Обновление

RegExr

This is(?s)(.*)sentence

Где (? S) включает модификатор dotall, в результате чего . соответствует символам новой строки.

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

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

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

149 голосов
/ 20 мая 2014

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

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

(?<=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)

Ссылка

36 голосов
/ 21 сентября 2011

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

15 голосов
/ 09 апреля 2016

Это:

This is (.*?) sentence

работает в JavaScript.

13 голосов
/ 01 января 2013

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

1 голос
/ 05 января 2018

В случае, если кто-то ищет пример этого в контексте 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)
        }
    }
}
1 голос
/ 22 сентября 2016

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

0 голосов
/ 24 апреля 2019

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.
}

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

0 голосов
/ 14 января 2019

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

для: This is just\na simple sentence

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

0 голосов
/ 25 декабря 2018

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

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

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

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...