Regex Збігайте всі символи між двома рядками


434

Приклад: "Це просто \ n просте речення".

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


11
Ви можете вказати, в якому середовищі ви використовуєте Regex. Можливо, існують відмінності залежно від того, що саме ви маєте на увазі під "ігнорувати" розриви рядків.
Ендрю Барбер

Відповіді:


646

Наприклад

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

Регекср

Я використовував (?<=)погляд і заздалегідь дивлюся вперед, (?=)щоб "Це є" і "речення" не було включено в матч, але це залежить від вашого випадку використання, ви також можете просто написати This is(.*)sentence.

Важливим тут є те, що ви активуєте режим "dotall" вашого двигуна регулярних вирівнювань, так що .відповідність новій лінії. Але як ви це зробите, залежить від вашого двигуна регексу.

Наступне, якщо ви використовуєте .*або .*?. Перший - жадібний і відповідатиме останньому "реченню" у рядку, другий - лінивий і відповідатиме наступному "реченню" у вашому рядку.

Оновлення

Регекср

This is(?s)(.*)sentence

Там, де (? S) вмикається модифікатор dotall, роблячи .відповідні символи нового рядка.

Оновлення 2:

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

відповідає вашому прикладу "Це (просте) речення". Дивіться тут на Regexr


@tchrist, вибач, що мені довелося це переглянути. Я розумію це правильно і This is(?s)(.*)sentenceпрацював би?
стема

@stema: Так, це повинно працювати, щоб увімкнути режим "крапки всіх" у більшості бібліотек регулярних виразів.
tchrist

1
Це здебільшого вирішило мою проблему, але як я включаю символ білого простору у свій малюнок? Я спробував таке: "(. *?) ())" Відповідати ")" в кінці послідовності, але це не вийшло.
0xbadf00d

28
Лише одна примітка - regexr каже, що огляд не підтримується у javascript
Kovo

2
Чи є спосіб впоратися з повторними екземплярами цього розколу в текстовому блоці? ЧОТИЙ приклад: "Це просто \ n просте речення. Ось кілька додаткових речей. Це просто \ n просте речення. І ось ще деякі речі. Це просто \ n просте речення." В даний час він відповідає всій рядку, а не кожному екземпляру.
jzadra

181

Необхідний лінивий квантор

Поновлення цього питання через те, що регулярний вираз у прийнятій відповіді мені не здається цілком правильним. Чому? Тому що

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

буде відповідати my first sentence. This is my secondвThis is my first sentence. This is my second sentence.

Дивіться демонстрацію .

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

Це відповідає тому, що ви хочете:

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

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

Режим DOTALL, щоб відповідати перервам лінії

Зауважте, що в демонстраційній версії встановлено режим "розрив точок лінії" (aka) dot-all (див. Як увімкнути DOTALL різними мовами ). У багатьох ароматах регулярного вираження ви можете встановити його за допомогою онлайн-модифікатора (?s), перетворюючи вираз у:

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

Довідково


Ви вірно ставитесь до групи захоплення. Не знаю, чому я це зробив. Але різниця між .*і .*?пояснюється також у моїй відповіді (абзац перед "Оновлення"). Тому я не вважаю, що моя відповідь є невірною.
стема

2
@stema Вибачте за приборкання, в той час, як вчора переглядав деякі ваші відповіді, це єдине, що змусило мене посмикнутися. :) Я пом’якшив перший рядок від is incorrectдо doesn't seem quite correct to me... Сподіваюсь, що це не змусить вас посмикнутися, ймовірно, лише різниця в уявленні про те, яким повинен бути регулярний вираз для такої відповіді на високий трафік.
zx81

39

Спробуйте This is[\s\S]*sentence, працює в JavaScript


як виконати ледачий пошук таким чином?
AGamePlayer

4
@AwQiruiGuo те саме, що вище. [\s\S]*?(також називається: ненаситна
підказка


13

використовуй це: (?<=beginningstringname)(.*\n?)(?=endstringname)


Не знаєте, чому всі голоси, що піднімаються, це дозволяє робити перерви у рядку 0-1, а перерва в рядку має бути безпосередньо перед цимendstringname
OGHaza

Мені здається корисним видалити початок рядків журналу (часова мітка тощо). Я використовував новий рядок для початку рядка та "at" для кінцевого рядка.
Стен

2

У випадку, якщо хтось шукає приклад цього в контексті Дженкінса. Він аналізує 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)
        }
    }
}


0

Піднесений текст 3х

У піднесеному тексті ви просто пишете два слова, які ви хочете зберегти, наприклад, у вашому випадку воно є

"Це" і "речення"

і ви пишете. * між ними

тобто This is .* sentence

і це повинно вам зробити добре


Не впевнений, питання полягає в тому, як це зробити в піднесеному тексті, але в основному це працює в піднесеному тексті. Це не працює, коли трапляється перерив між рядком "Це" та "речення". Крім того, піднесений текст також вибирає "Це є" та "Речення", а не лише текст між цими двома рядками.
Ділан Кіннетт

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

Я приземлився сюди, на своєму пошуку regex, щоб перетворити цей синтаксис друку між print "string", в Python2 в старі сценарії з: print ("string"), для Python3. Добре працює, інакше використовуйте 2to3.py для додаткових перетворень. Ось моє рішення для інших:

Спробуйте це на Regexr.com (чомусь не працює в NP ++):

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

для змінних:

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

для мітки та змінної:

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

Як замінити всю "string" для друку в Python2 на print ("string") для Python3?


0

Це працювало для мене (я використовую код VS ):

для: This is just\na simple sentence

Використання: This .+ sentence


0

RegEx відповідатиме між двома рядками за допомогою підходу Java.

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

Для використання RegEx (. ?) * Будемо використовувати об’єкти Pattern і Matcher .

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.