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


436

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

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


12
Возможно, вы захотите указать, в какой среде вы используете Regex. Могут быть различия в зависимости от того, что именно вы подразумеваете под «игнорированием» разрывов строк.
Эндрю Барбер

Ответы:


647

Например

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

RegExr

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

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

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

Обновить

RegExr

This is(?s)(.*)sentence

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

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

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

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


@ tchrist, прости, мне пришлось это посмотреть. Я правильно понимаю, и This is(?s)(.*)sentenceбудет работать?
Stema

@stema: Да, это должно работать, чтобы включить режим «точка все» в большинстве библиотек регулярных выражений.
tchrist

1
Это в основном решило мою проблему, но как мне включить символ пробела в свой шаблон? Я попробовал следующее: "(. *?) ())", Чтобы соответствовать ")" в конце последовательности, но это не сработало.
0xbadf00d

28
Только одно замечание - regexr говорит теперь, что lookbehind не поддерживается в javascript
Kovo

2
Есть ли способ справиться с повторными случаями этого разделения в блоке текста? Например: «Это просто \ na простое предложение. Вот некоторые дополнительные вещи. Это просто \ na простое предложение. А вот еще несколько вещей. Это просто \ na простое предложение.». В настоящее время он соответствует всей строке, а не каждому экземпляру.
Джадра

183

Нужен ленивый квантификатор

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

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

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

Смотрите демо .

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

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

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

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

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

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

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

Ссылка


Вы правы насчет группы захвата. Не знаю, почему я это сделал. Но разница между .*и .*?объясняется также в моем ответе (абзац перед «Обновление»). Поэтому я не думаю, что мой ответ неверен.
Stema

2
@stema Извините за придирки, пока я читал вчера некоторые из ваших ответов, это единственный, который заставил меня дергаться. :) Я смягчила первую строку с is incorrectдо doesn't seem quite correct to me... Надеюсь, что это не заставляет вас дергаться, возможно, просто разница в восприятии того, каким должно быть выражение для такого большого трафика.
zx81

39

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


как выполнить ленивый поиск таким образом?
AGamePlayer

4
@AwQiruiGuo так же, как и выше. [\s\S]*?(также называется: не жадный шаблон)
phil294


13

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


Не знаю, почему все «за» проголосовали, это допускает разрывы строки 0-1, а разрыв строки должен быть непосредственно передendstringname
OGHaza

Я нашел полезным удалить начало строк журнала (отметка времени и т. Д.). Я использовал новую строку для начальной строки и «at» для конечной строки.
Стэн

2

В случае, если кто-то ищет пример этого в контексте 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

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

за: This is just\na simple sentence

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


0

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

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

«Это» и «предложение»

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

т.е. This is .* sentence

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


Не уверен, что вопрос в том, как это сделать в Sublime Text, но в основном работает в Sublime Text. Это не работает, когда случается разрыв строки между «Это» и «предложение». Кроме того, возвышенный текст также выбирает «Это» и «Предложение», а не только текст между этими двумя строками.
Дилан Киннетт

0

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

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

0

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


0

Я попал сюда при поиске регулярного выражения для преобразования этого синтаксиса печати между 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?


0

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.