найти весь текст перед использованием регулярных выражений - PullRequest
6 голосов
/ 18 июня 2010

Как я могу использовать регулярные выражения, чтобы найти весь текст перед текстом " Весь текст до этой строки будет включен "?

У меня есть пример текста ниже, например

This can include deleting, updating, or adding records to your database, which would then be reflex.

All text before this line will be included

You can make this a bit more sophisticated by encrypting the random number and then verifying that it is still a number when it is decrypted. Alternatively, you can pass a value and a key instead.

Ответы [ 3 ]

12 голосов
/ 18 июня 2010

Начиная с объяснения ... переходите к концу для быстрых ответов

Чтобы сопоставить определенный фрагмент текста и подтвердить, что он есть, но не включить его в совпадение, вы можете использовать положительный прогноз, используя нотацию (?=regex)

Это подтверждает, что 'regex' существует в этой позиции, но соответствует только начальной позиции, а не ее содержимому.

Итак, это дает нам выражение:

.*?(?=All text before this line will be included)

Где . - любой символ, а *? - ленивое совпадение (потребляет наименьшее возможное количество по сравнению с обычным *, который потребляет наибольшее возможное количество).

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

И это может быть реализовано различными способами, включая ...

Глобально, для регулярных выражений на основе /:

/regex/s

Встроенное, глобальное для регулярного выражения:

(?s)regex

Встроенный, применяется только к части в скобках:

(?s:reg)ex

И в качестве аргумента функции (зависит от того, с каким языком вы используете регулярное выражение).

Итак, вероятно, вы хотите следующее регулярное выражение:

(?s).*?(?=All text before this line will be included)


Однако есть несколько предостережений:

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

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

Наконец, вы не всегда можете указывать флаги, такие как s выше, поэтому может потребоваться либо сопоставить «что-нибудь или новую строку» (.|\n) или, возможно, [\s\S] (пробел, а не пробел), чтобы получить эквивалент согласование.

Если вы ограничены всеми этими (я думаю, что реализация XML), то вам придется сделать:

([\s\S]*)All text before this line will be included

А затем извлечь первую подгруппу из результата матча.

9 голосов
/ 18 июня 2010
(.*?)All text before this line will be included

В зависимости от того, какую конкретную платформу регулярных выражений вы используете, вам может потребоваться включить флаг, чтобы указать, что . также может соответствовать символам новой строки.

Первый (и единственный)подгруппа будет включать сопоставленный текст.То, как вы извлечете это, снова будет зависеть от того, какой язык и среду регулярных выражений вы используете.

Если вы хотите включить текст «Весь текст до этой строки ...», товесь матч - это то, что вы хотите.

1 голос
/ 18 июня 2010

Это должно сделать это:

<?php
$str = "This can include deleting, updating, or adding records to your database, which would then be reflex.

All text before this line will be included

You can make this a bit more sophisticated by encrypting the random number and then verifying that it is still a number when it is decrypted. Alternatively, you can pass a value and a key instead.";

echo preg_filter("/(.*?)All text before this line will be included.*/s","\\1",$str);
?>

Возвращает:

This can include deleting, updating, or adding records to your database, which would then be reflex.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...