найдите весь текст перед использованием regex

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

Я имею, включает некоторый демонстрационный текст ниже, например,

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.
6
задан jeff 18 June 2010 в 16:24
поделиться

3 ответа

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

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

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

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

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

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

Однако, почти во всех вариантах regex . будет исключать новые строки, поэтому нам нужно явно использовать флаг для включения новых строк. Флаг, который нужно использовать, это s, (что означает "Single-line mode", хотя в некоторых вариантах он также называется "DOTALL" mode).

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

Глобально, для /-based regexes:

/regex/s

В строке, глобально для regex:

(?s)regex

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

(?s:reg)ex

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

Итак, вероятно, вам нужен следующий regex:

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


Однако есть некоторые оговорки:

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

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

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

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

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

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

12
ответ дан 8 December 2019 в 05:53
поделиться
(.*?)All text before this line will be included

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

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

Если вы хотите включить текст "Весь текст перед этой строкой...", то вам нужно все совпадение.

9
ответ дан 8 December 2019 в 05:53
поделиться

Это должно сработать:

<?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.
1
ответ дан 8 December 2019 в 05:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: