Primeiro, alguns comentários, com elogios por ter escrito isso em dez minutos:
-
(?<=\p{L}) => É bom, mas proponho incluir “a letra” na captura real, para que o usuário veja onde o regex encontrou um possível “fim de frase”. Elogios por capturar letras maiúsculas e minúsculas. Então, substituo ?<= por ?: na minha proposta.
-
(?<!\\[\w+]) => Acredito que, para sua intenção de evitar falsos positivos com algum marcador, esta parte precisa estar à esquerda da sua “letra”. Além disso, o + deve estar fora dos colchetes, pois muitos marcadores têm múltiplos caracteres, como \s1.
-
E certos marcadores incluem o *, por exemplo, fim de algo como \em*. Lembro vagamente que certos marcadores podem ou devem incluir +. Se for esse o caso, você pode facilmente adicionar à lista de caracteres, como [\w*+].
-
\s*(?:\\\w+)?\s* => Este eu substituo por "pular qualquer número de marcadores potenciais e qualquer espaço em branco entre o final do versículo e o início do próximo versículo.
-
\\v [\d\w]+ \p{Lu} => Encontra um versículo seguido por uma letra maiúscula. Parece que você está confiante aqui sobre um “espaço clássico” entre \v e o número do versículo e após o número do versículo, então mantive essa sintaxe.
Gostaria de submeter um regex modificado, sem afirmar que é a solução final, apenas com a esperança de cobrir mais casos:
(?<!\\[\w\*]*)(?:\p{L})\s*(?:\\[\w\*]+\s+)*\\v [\d\w]+ \p{Lu}
Aqui está a descrição do meu regex, conforme minha ferramenta:
(?<!\\[\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}Opções: Sem distinção entre maiúsculas e minúsculas; Espaçamento exato; Ponto corresponde a quebras de linha
-
Afirma que é impossível corresponder ao regex abaixo de trás para frente nesta posição (lookbehind negativo)
- Corresponde ao caractere de barra invertida
-
Corresponde a um único caractere presente na lista abaixo
- Entre zero e um número ilimitado de vezes, o máximo possível, devolvendo conforme necessário (ganancioso)
- Um “caractere de palavra” (Unicode; qualquer letra ou ideograma, dígito, número de letra, pontuação de conector)
- O caractere literal “*”
-
Corresponde à expressão regular abaixo
- Corresponde a um caractere da categoria Unicode “letra” (qualquer tipo de letra de qualquer idioma)
-
Corresponde a um único caractere que é um “caractere de espaço em branco” (qualquer separador Unicode, tabulação, avanço de linha, retorno de carro, tabulação vertical, avanço de formulário, próxima linha, espaço de largura zero)
- Entre zero e um número ilimitado de vezes, o máximo possível, devolvendo conforme necessário (ganancioso)
-
Corresponde à expressão regular abaixo
- Entre zero e um número ilimitado de vezes, o máximo possível, devolvendo conforme necessário (ganancioso)
- Corresponde ao caractere de barra invertida
-
Corresponde a um único caractere presente na lista abaixo
- Entre um e um número ilimitado de vezes, o máximo possível, devolvendo conforme necessário (ganancioso)
- Um “caractere de palavra” (Unicode; qualquer letra ou ideograma, dígito, número de letra, pontuação de conector)
- O caractere literal “*”
-
Corresponde a um único caractere que é um “caractere de espaço em branco” (qualquer separador Unicode, tabulação, avanço de linha, retorno de carro, tabulação vertical, avanço de formulário, próxima linha, espaço de largura zero)
- Entre um e um número ilimitado de vezes, o máximo possível, devolvendo conforme necessário (ganancioso)
- Corresponde ao caractere de barra invertida
- Corresponde à sequência de caracteres “v ” literalmente (sem distinção entre maiúsculas e minúsculas)
-
Corresponde a um único caractere presente na lista abaixo
- Entre um e um número ilimitado de vezes, o máximo possível, devolvendo conforme necessário (ganancioso)
- Um “dígito” (qualquer número decimal em qualquer script Unicode)
- Um “caractere de palavra” (Unicode; qualquer letra ou ideograma, dígito, número de letra, pontuação de conector)
- Corresponde ao caractere “ ” literalmente
- Corresponde a um caractere da categoria Unicode “letra maiúscula” (uma letra maiúscula que tem uma variante minúscula)
E aqui está um texto de exemplo que usei para testes. Provavelmente incompleto (no final de cada exemplo, indico se é uma captura ou não):
\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]
Então, foi divertido. Espero não estar muito longe. Infelizmente, nunca consigo lembrar qual sabor de regex o PT usa. Se houver problemas de sintaxe devido aos sabores, posso facilmente aplicar um diferente, como .NET ou Java, e executar minha ferramenta novamente.
Novamente: Não a solução, mas talvez útil para iniciar um diálogo.
hth