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

328

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

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

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

11 ответов

438
Лучший ответ

Например

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

Regexr

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

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

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

Обновление

Regexr

This is(?s)(.*)sentence

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

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

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

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

  • 1
    Обычно встраивание (?s) работает.
  • 0
    @ tchrist, прости, мне пришлось это посмотреть. Я правильно понимаю, и This is(?s)(.*)sentence будет работать?
Показать ещё 18 комментариев
138

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

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

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

Ссылка

  • 0
    Вы правы насчет группы захвата. Не знаю, почему я это сделал. Но разница между .* .*? Также объясняется в моем ответе (абзац перед «Обновлением»). Поэтому я не думаю, что мой ответ неверен.
  • 2
    @stema Извините за придирки, пока я читал вчера некоторые из ваших ответов, это единственный, который заставил меня дергаться. :) Я смягчила первую строку с is incorrect чтобы doesn't seem quite correct to me ... Надеюсь, это не заставляет вас дергаться, возможно, просто разница в восприятии того, каким должно быть выражение для такого большого трафика. ,
31

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

  • 0
    как выполнить ленивый поиск таким образом?
  • 3
    @AwQiruiGuo так же, как и выше. [\s\S]*? (также называется: не жадный шаблон)
14

Это:

This is (.*?) sentence

работает в javascript.

  • 2
    Вы можете показать пример кода в JS?
  • 0
    К сожалению, строка не совпадает с новыми строками.
13

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

  • 0
    Не знаю, почему все "за" проголосовали, это допускает разрывы строки 0-1, а разрыв строки должен быть непосредственно перед endstringname
  • 0
    Я нашел полезным удалить начало строк журнала (отметка времени и т. Д.). Я использовал новую строку для начальной строки и «at» для конечной строки.
1

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

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

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

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

0

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

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

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

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

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

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

т.е. This is.* sentence

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню