Primero, algunos comentarios, con elogios por escribir eso en diez minutos:
-
(?<=\p{L}) => Está bien, pero propongo incluir «la letra» en la captura real, para que el usuario vea dónde la expresión regular detectó un posible «final de oración». Elogios por capturar letras mayúsculas y minúsculas. Así que reemplazo ?<= con ?: en mi propuesta.
-
(?<!\\[\w+]) => Creo que, para tu intención de evitar falsos positivos con algún marcador, esta parte debe estar a la izquierda de tu «letra». Además, el + debería estar fuera de los corchetes, ya que muchos marcadores tienen múltiples caracteres, como \s1.
-
Y ciertos marcadores incluyen el *, por ejemplo, el final de algo como \em*. Recuerdo vagamente que ciertos marcadores pueden o incluso deben incluir +. Si ese es el caso, puedes agregar fácilmente a la lista de caracteres como [\w*+].
-
\s*(?:\\\w+)?\s* => Este lo reemplazo con «saltar cualquier número de marcadores potenciales y cualquier espacio en blanco entre el final del versículo y el inicio del siguiente versículo.
-
\\v [\d\w]+ \p{Lu} => Encontrar un versículo seguido de una letra mayúscula. Parece que estás seguro aquí de un «espacio clásico» entre \v y el número del versículo y después del número del versículo, así que mantuve esa sintaxis.
Me gustaría presentar una expresión regular modificada, sin afirmar que sea la solución final, solo con la esperanza de cubrir más casos:
(?<!\\[\w\*]*)(?:\p{L})\s*(?:\\[\w\*]+\s+)*\\v [\d\w]+ \p{Lu}
Aquí está la descripción de mi expresión regular, según mi herramienta:
(?<!\\[\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}Opciones: Sin distinción entre mayúsculas y minúsculas; Espaciado exacto; El punto coincide con los saltos de línea
-
Afirmar que es imposible que la expresión regular siguiente coincida hacia atrás en esta posición (mirada hacia atrás negativa)
- Coindicir con el carácter de barra invertida
-
Coindicir con un solo carácter presente en la lista siguiente
- Entre cero y un número ilimitado de veces, tantas veces como sea posible, devolviendo lo necesario (codicioso)
- Un «carácter de palabra» (Unicode; cualquier letra o ideograma, dígito, número de letra, puntuación conectora)
- El carácter literal «*»
-
Coindicir con la expresión regular siguiente
- Coindicir con un carácter de la categoría Unicode «letra» (cualquier tipo de letra de cualquier idioma)
-
Coindicir con un solo carácter que sea un «carácter de espacio en blanco» (cualquier separador Unicode, tabulación, salto de línea, retorno de carro, tabulación vertical, salto de página, siguiente línea, espacio de ancho cero)
- Entre cero y un número ilimitado de veces, tantas veces como sea posible, devolviendo lo necesario (codicioso)
-
Coindicir con la expresión regular siguiente
- Entre cero y un número ilimitado de veces, tantas veces como sea posible, devolviendo lo necesario (codicioso)
- Coindicir con el carácter de barra invertida
-
Coindicir con un solo carácter presente en la lista siguiente
- Entre uno y un número ilimitado de veces, tantas veces como sea posible, devolviendo lo necesario (codicioso)
- Un «carácter de palabra» (Unicode; cualquier letra o ideograma, dígito, número de letra, puntuación conectora)
- El carácter literal «*»
-
Coindicir con un solo carácter que sea un «carácter de espacio en blanco» (cualquier separador Unicode, tabulación, salto de línea, retorno de carro, tabulación vertical, salto de página, siguiente línea, espacio de ancho cero)
- Entre uno y un número ilimitado de veces, tantas veces como sea posible, devolviendo lo necesario (codicioso)
- Coindicir con el carácter de barra invertida
- Coindicir con la cadena de caracteres «v » literalmente (sin distinción entre mayúsculas y minúsculas)
-
Coindicir con un solo carácter presente en la lista siguiente
- Entre uno y un número ilimitado de veces, tantas veces como sea posible, devolviendo lo necesario (codicioso)
- Un «dígito» (cualquier número decimal en cualquier escritura Unicode)
- Un «carácter de palabra» (Unicode; cualquier letra o ideograma, dígito, número de letra, puntuación conectora)
- Coindicir con el carácter « » literalmente
- Coindicir con un carácter de la categoría Unicode «letra mayúscula» (una letra mayúscula que tiene una variante minúscula)
Y aquí hay un texto de muestra que usé para probar. Probablemente incompleto (al final de cada ejemplo, indico si es una coincidencia o no):
\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]
Así que, esto fue divertido. Espero no estar muy lejos. Lamentablemente, nunca puedo recordar qué variante de expresiones regulares usa PT. Si hay problemas con la sintaxis debido a las variantes, podría aplicar fácilmente una diferente, como .NET o Java, y volver a ejecutar mi herramienta.
Otra vez: No la solución, pero quizás útil para iniciar un diálogo.
hth