Сначала немного обратной связи, с комплиментами за то, что вы написали это за десять минут:
-
(?<=\p{L}) => Хорошо, но я предлагаю включить «букву» в фактическое совпадение, чтобы пользователь видел, где регулярное выражение заметило потенциальный «конец предложения». Комплименты за то, что вы учли и заглавные, и строчные буквы. Так что в моем предложении я заменяю ?<= на ?:.
-
(?<!\\[\w+]) => Я считаю, что для вашей цели избежать ложных срабатываний с некоторым маркером, эта часть должна быть слева от вашей «буквы». Также + должен быть вне квадратных скобок, так как у многих маркеров несколько символов, например \s1.
-
И некоторые маркеры включают *, например конец чего-либо, как \em*. Я смутно помню, что некоторые маркеры могут или даже должны включать +. Если это так, вы можете легко добавить в список символов, например [\w*+].
-
\s*(?:\\\w+)?\s* => Я заменяю это на «пропустить любое количество потенциальных маркеров и любые пробелы между концом стиха и началом следующего стиха».
-
\\v [\d\w]+ \p{Lu} => Найти стих, за которым следует заглавная буква. Кажется, вы уверены здесь в «классическом пробеле» между \v и номером стиха и после номера стиха, поэтому я сохранил этот синтаксис.
Я хотел бы предложить измененное регулярное выражение, не утверждая, что это окончательное решение, просто надеюсь, что оно покрывает больше случаев:
(?<!\\[\w\*]*)(?:\p{L})\s*(?:\\[\w\*]+\s+)*\\v [\d\w]+ \p{Lu}
Вот описание моего регулярного выражения, согласно моему инструменту:
(?<!\\[\w\*]*)(?:\p{L})\s*(?:\\[\w\*]+\s+)*\\v [\d\w]+ \p{Lu}
(?<!\\[\w\*]*)(?:\p{L})\s*(?:\\[\w\*]+\s+)*\\v [\d\w]+ \p{Lu}
(?<!\\[\w\*]*)(?:\p{L})\s*(?:\\[\w\*]+\s+)*\\v [\d\w]+ \p{Lu}Опции: Без учета регистра; Точное расстояние; Точка соответствует переносу строки
-
Утверждение, что невозможно сопоставить регулярное выражение ниже в обратном направлении в этой позиции (отрицательный просмотр назад)
- Сопоставить символ обратного слэша
-
Сопоставить один символ, присутствующий в списке ниже
- От нуля до бесконечного количества раз, столько раз, сколько возможно, отступая по необходимости (жадное)
- «Словесный символ» (Unicode; любая буква или иероглиф, цифра, буквенный номер, соединительная пунктуация)
- Буквальный символ «*»
-
Сопоставить регулярное выражение ниже
- Сопоставить символ из категории Unicode «буква» (любой вид буквы из любого языка)
-
Сопоставить один символ, который является «символом пробела» (любой разделитель Unicode, табуляция, перевод строки, возврат каретки, вертикальная табуляция, перевод формы, следующая строка, символ нулевой ширины)
- От нуля до бесконечного количества раз, столько раз, сколько возможно, отступая по необходимости (жадное)
-
Сопоставить регулярное выражение ниже
- От нуля до бесконечного количества раз, столько раз, сколько возможно, отступая по необходимости (жадное)
- Сопоставить символ обратного слэша
-
Сопоставить один символ, присутствующий в списке ниже
- От одного до бесконечного количества раз, столько раз, сколько возможно, отступая по необходимости (жадное)
- «Словесный символ» (Unicode; любая буква или иероглиф, цифра, буквенный номер, соединительная пунктуация)
- Буквальный символ «*»
-
Сопоставить один символ, который является «символом пробела» (любой разделитель Unicode, табуляция, перевод строки, возврат каретки, вертикальная табуляция, перевод формы, следующая строка, символ нулевой ширины)
- От одного до бесконечного количества раз, столько раз, сколько возможно, отступая по необходимости (жадное)
- Сопоставить символ обратного слэша
- Сопоставить строку символов «v » буквально (без учета регистра)
-
Сопоставить один символ, присутствующий в списке ниже
- От одного до бесконечного количества раз, столько раз, сколько возможно, отступая по необходимости (жадное)
- «Цифра» (любая десятичная цифра в любой системе записи Unicode)
- «Словесный символ» (Unicode; любая буква или иероглиф, цифра, буквенный номер, соединительная пунктуация)
- Сопоставить символ « » буквально
- Сопоставить символ из категории Unicode «заглавная буква» (заглавная буква, у которой есть строчный вариант)
А вот и некоторый пример текста, который я использовал для тестирования. Скорее всего, он неполный (в конце каждого примера я отмечаю, является ли это совпадением или нет):
\v 8 Some text without \em punctuation\em* \rem \any \v 9 A new verse which is a new sentence, starting with a capital. [catch]
\v 8 Some text without \em punctuation\em* \v 9 A new verse which is a new sentence, starting with a capital. [catch]
\v 8 Some text without punctuation \v 9a A new verse which is a new sentence, starting with a capital. [catch]
\v 8 Some text with proper \em punctuation.\em* \just \one \more \v 9 A new verse which is a new sentence, starting with a capital. [punctuation present, so no catch]
\v 8 Some text ending an an all-cap word like \em LORD\em* \v 9 A new verse which is a new sentence, starting with a capital. [catch]
\v 10 A long sentence \whatever \v 11a over two verses or more. [No punctuation needed, so no catch]
Так что, это было весело. Надеюсь, я не слишком ошибаюсь. К сожалению, я никогда не могу вспомнить, какой вариант регулярных выражений использует PT. Если есть проблемы с синтаксисом из-за вариантов, я мог бы легко применить другой, например .NET или Java, и запустить мой инструмент снова.
Еще раз: Не решение, но, возможно, полезное, чтобы начать диалог.
hth