Estou tentando escrever uma substituição de String para corresponder a qualquer caractere (uma palavra) com um espaço depois e um ? ou : ou !, exceto todas as tags.
O objetivo é recuperar palavras únicas que tenham depois delas um espaço e ?, : ou ! para encapsulá-las em uma tag<span style="display:inline-block;">$1</span>
Eu tento:
([\S]* [\?\:!])
Um exemplo: link de demonstração
Para o teste 1 ao teste 4 está bom.
Para o teste 5, não quero capturá-lo de forma alguma
Para o teste 6, quero capturar toda a linha
Para o teste7 eu quero apenastest7 ?
Para o teste8 eu quero apenastest8 <span>:</span>
Para o teste 9, quero capturar toda a linha
As tags são apenas exemplos
Este regex corresponde aos padrões de string que você está procurando. A abordagem para o padrão foi usar alternância para corresponder a todos os casos desejados de strings. Os nomes dos elementos HTML podem variar.
A principal coisa que procuramos corresponder são strings onde há um espaço
antes de
?
,:
,!
, ou ```<````.PADRÃO REGEX (sabor PCRE2):
Demonstração do Regex: https://regex101.com/r/gbxQhh/4
STRING DE TESTE | CORRESPONDÊNCIA:
CADEIA DE TESTE (T)| CORRESPONDÊNCIA (M):
NOTAS DE EXAMES REG:
<
Corresponder literalmente<
.(?<el2>
Comece o grupo de captura nomeado para capturar o nome do elemento<[element name]>
. Grupo nomeado "el2". Referido com\k<el2>
mais adiante no padrão (usado para corresponder à tag de fechamento ).[^\W\d]+
Classe de caractere negado[^...]
. Corresponde a qualquer caractere que não seja um caractere não alfanumérico ou sublinhado\W
ou um dígito\d
, ou seja, uma letra, 1 ou mais vezes (+
).)
[^>]*
Classe de caractere negado[^...]
. Corresponde a qualquer caractere que não seja>
0 ou mais vezes (*
)>
Corresponder literalmente>
.[ ]*
Corresponde ao caractere de espaço literal*
).\K
\K redefine o ponto inicial da partida reportada. Quaisquer caracteres consumidos anteriormente não são mais incluídos na partida final.(?:
Iniciar grupo de não captura(?:...)
.\w+
Corresponder caractere alfanumérico ou sublinhado 1 ou mais vezes (+
).[ ]
Corresponde ao caractere de espaço literal<
Corresponder literalmente<
..*?
Corresponde a qualquer caractere, exceto nova linha, 0 ou mais vezes (*
). Seja preguiçoso (*?
) e corresponda a quantos caracteres forem necessários para fazer a correspondência.)
(?=
Começa lookahead positivo . Não consumirá nenhum caractere. Procura (corresponde) a tag de fechamento para o elemento de abertura correspondido com<(?<el2>[^\W\d]+)[^>]*>
.<\/
Corresponder literalmente</
.\k<el2>
Corresponde ao nome do elemento , armazenado no grupo el2 para criar uma tag de fechamento (usada para corresponder à tag de fechamento ).>
Corresponder literalmente>
.)
|
OU<
Corresponder literalmente<
.(?:
Iniciar grupo de não captura(?:...)
.(?<el1>
Comece o grupo de captura nomeado para capturar o nome do elemento<[element name]>
. Grupo nomeado "el1". Referido com\k<el1>
mais adiante no padrão.[^\W\d]*
Classe de caractere negado[^...]
. Corresponde a qualquer caractere que não seja um caractere não alfanumérico ou sublinhado\W
ou um dígito\d
, ou seja, uma letra, 0 ou mais vezes (*
).)
[^>]*
Classe de caractere negado[^...]
. Corresponde a qualquer caractere que não seja>
0 ou mais vezes (*
).>
Corresponder literalmente>
.\w+
Corresponder caractere alfanumérico ou sublinhado 1 ou mais vezes (+
).<(?:(?<el1>[^\W\d]*)[^>]*>
:<\/
Corresponder literalmente</
.\k<el1>
Corresponde ao nome do elemento , armazenado no grupo el1 para criar uma tag de fechamento.>
Corresponder literalmente>
..*
Corresponde a qualquer caractere, exceto nova linha, o ou mais vezes (```*``).)
$
Final da linha de partida.|
OU\w+
Corresponder caractere alfanumérico ou sublinhado 1 ou mais vezes (+
).[ ]
Corresponder caractere de espaço literal*
)[?:!]
Corresponder?
,:
ou!
.Por que manter as coisas simples quando você pode complicar? (expressão francesa ;-)
Meu objetivo era evitar quebras de linha automáticas entre uma palavra e um sinal de pontuação.
Eu pensei que seria muito mais simples substituir o espaço por
!Então eu faço isso para os sinais de pontuação no final:
[ ]+([\?\:!€"»;\)\]}])
Substituir por
$1
E isto para os sinais de pontuação no início:
(["«\(\[{])[ ]+([\w])
Substituir por
$1 $2
Acho que isso será suficiente.