Quando uma correspondência é bem-sucedida, qualquer número imediatamente anterior à palavra correspondente será incluído no resultado da correspondência, e isso se aplica até mesmo a caracteres Unicode.
Números imediatamente após a palavra correspondente não apresentam esse comportamento;
Isso também afeta a correspondência de números, incluindo casos em que as strings consistem apenas de letras em inglês e números. Por exemplo, “Test123” só pode corresponder a “Test”, mas não pode corresponder a “123” ou a “Test123” (a si mesma).
Eu posso estar um pouco desatualizado — que tipo de regra de correspondência é essa? Alguém poderia me explicar?
Parece um possível bug de regex, que são sempre um pouco complicados de desenrolar. @zogstrip talvez você possa dar uma olhada, já que trabalhou nessa área recentemente (embora isso pareça existir há um tempo).
Aqui está o meu entendimento…
Quando estamos verificando palavras, há 3 segmentos que precisam corresponder: inicial, a palavra, final. Definimos inicial e final como caracteres não-letras… estes podem ser pontuação, espaços, OU números. Os números são o que está causando o problema na correspondência aqui. A intenção é ser capaz de capturar palavras mesmo que haja pontuação ou o que for antes/depois da palavra.
Então, a regex vê 123Test, encontra Test, olha antes e encontra 3 e isso corresponde como um “não-letra”, depois olha depois e encontra o fim da palavra. Então corresponde em 3Test.
Eu acho que precisamos verificar caracteres não-letras E não-números nos segmentos inicial/final para evitar isso? Não sei se há uma razão pela qual não incluímos números ou se é apenas uma supervisão.
Isto deve corrigir isso de forma definitiva desta vez. Tivemos alguma inconsistência entre a versão Ruby e a versão JS das expressões regulares usadas, mas isso agora é desnecessário.