Estou usando regexes Java no Java 1.6 (para analisar a saída numérica, entre outros propósitos) e não consigo encontrar uma definição precisa de \b
("limite de palavras"). Eu tinha assumido que -12
seria uma "palavra inteira" (correspondida por \b\-?\d+\b
), mas parece que isso não funciona. Ficaria muito grato em saber como combinar números separados por espaço.
Exemplo:
Pattern pattern = Pattern.compile("\\s*\\b\\-?\\d+\\s*");
String plus = " 12 ";
System.out.println(""+pattern.matcher(plus).matches());
String minus = " -12 ";
System.out.println(""+pattern.matcher(minus).matches());
pattern = Pattern.compile("\\s*\\-?\\d+\\s*");
System.out.println(""+pattern.matcher(minus).matches());
Isso retorna:
true
false
true
regex
word-boundary
peter.murray.rust
fonte
fonte
Respostas:
Um limite de palavras, na maioria dos dialetos regex, é uma posição entre
\w
e\W
(caractere não-palavra), ou no início ou no final de uma sequência, se ela começa ou termina (respectivamente) com um caractere de palavra ([0-9A-Za-z_]
).Portanto, na sequência
"-12"
, ela corresponderia antes do 1 ou após o 2. O traço não é um caractere de palavra.fonte
\b
é uma asserção de largura zero que corresponde se houver\w
de um lado e se houver\W
do outro ou se a posição estiver no início ou no final da string.\w
é arbitrariamente definido como caracteres "identificadores" (alnums e sublinhado), não como algo especialmente útil para o inglês.\bhello\b
sem usar\b
(usando\w
,\W
e outros)?(^|\W)hello($|\W)
exceto que ele não capturaria nenhum caractere que não seja palavra antes e depois, portanto seria mais parecido(^|(?<=\W))hello($|(?=\W))
(usando asserções lookahead / lookbehind).(?<!\w)hello(?!\w)
.Um limite de palavras pode ocorrer em uma das três posições:
Os caracteres do Word são alfanuméricos; um sinal de menos não é. Retirado do Tutorial do Regex .
fonte
Durante o aprendizado da expressão regular, fiquei realmente preso ao metacaractere que é
\b
. Na verdade, não compreendi seu significado enquanto me perguntava " o que é, o que é " repetidamente. Depois de algumas tentativas usando o site , assisto os traços verticais cor-de-rosa no início de todas as palavras e no final das palavras. Entendi bem o significado naquele momento. Agora é exatamente o limite da palavra (\w
) .Minha opinião é apenas imensamente orientada para a compreensão. A lógica por trás disso deve ser examinada a partir de outras respostas.
fonte
Um limite de palavra é uma posição que é precedida por um caractere de palavra e não seguida por um, ou seguida por um caractere de palavra e não precedida por um.
fonte
Eu falo sobre quais
\b
limites de regex estilo estão aqui .A história curta é que eles são condicionais . O comportamento deles depende do que eles são próximos.
Às vezes não é isso que você deseja. Veja minha outra resposta para elaboração.
fonte
Eu gostaria de explicar a resposta de Alan Moore
Suponha que eu tenha uma string "Isso é um c a t, e ela é uma coisa impressionante", e devo substituir todas as ocorrências pela letra 'a' somente se essa letra existir no "Limite de uma palavra" , ou seja, a carta
a
dentro de 'gato' não deve ser substituída.Então, eu vou executar regex (em Python ) como
re.sub("\ba","e", myString.strip())
// substituaa
pore
então a saída será Este é
e
c um te
nd ela dee
wesomefonte
Corri para um problema ainda pior quando procurar texto para palavras como
.NET
,C++
,C#
, eC
. Você pensaria que os programadores de computador saberiam melhor do que nomear uma linguagem como algo difícil de escrever expressões regulares.De qualquer forma, foi o que eu descobri (resumido principalmente em http://www.regular-expressions.info , que é um ótimo site): Na maioria dos tipos de regex, os caracteres correspondentes à classe de caracteres abreviados
\w
são os caracteres que são tratados como caracteres de palavra pelos limites da palavra. Java é uma exceção. Java suporta Unicode para\b
mas não para\w
. (Tenho certeza de que havia uma boa razão para isso no momento).A
\w
significa "caráter palavra". Sempre corresponde aos caracteres ASCII[A-Za-z0-9_]
. Observe a inclusão de sublinhado e dígitos (mas não traço!). Na maioria dos tipos de suporte ao Unicode,\w
inclui muitos caracteres de outros scripts. Há muita inconsistência sobre quais caracteres estão realmente incluídos. Letras e dígitos de scripts e ideogramas alfabéticos geralmente estão incluídos. A pontuação do conector, exceto os símbolos de sublinhado e numéricos que não são dígitos, pode ou não ser incluída. Esquema XML e XPath incluem até todos os símbolos\w
. Mas Java, JavaScript e PCRE correspondem apenas a caracteres ASCII com\w
.É por isso que pesquisas regex Java baseada em para
C++
,C#
ou.NET
(mesmo quando você se lembrar de escapar do período e vantagens) são parafusados pelo\b
.Nota: Não tenho certeza do que fazer com relação a erros no texto, como quando alguém não coloca um espaço depois de um ponto no final de uma frase. Eu permiti, mas não tenho certeza de que seja necessariamente a coisa certa a fazer.
De qualquer forma, em Java, se você estiver pesquisando texto para essas linguagens de nomes estranhos, precisará substituir o
\b
por antes e depois dos designadores de espaço em branco e pontuação. Por exemplo:Então, em seu teste ou função principal:
PS Meus agradecimentos a http://regexpal.com/ sem os quais o mundo regex seria muito infeliz!
fonte
C#
, mas agora é mais claraConfira a documentação sobre condições de contorno:
http://java.sun.com/docs/books/tutorial/essential/regex/bounds.html
Confira este exemplo:
Ao imprimi-lo, observe que a saída é esta:
[Encontrei o valor -, na minha string.]
Isso significa que o caractere "-" não está sendo escolhido como estando no limite de uma palavra porque não é considerado um caractere de palavra. Parece que @brianary meio que me venceu, então ele recebe uma votação positiva.
fonte
O limite da palavra \ b é usado onde uma palavra deve ser um caractere de palavra e outra um caractere que não seja palavra. Expressão regular para número negativo deve ser
verificar DEMO em funcionamento
fonte
Acredito que seu problema se deva ao fato de
-
não ser um caractere de palavra. Assim, o limite da palavra corresponderá após o-
e, portanto, não o capturará. Os limites da palavra correspondem antes dos caracteres da primeira e da última palavra em uma sequência de caracteres, bem como em qualquer lugar em que antes seja um caractere de palavra ou não-palavra e depois o oposto. Observe também que o limite da palavra é uma correspondência de largura zero.Uma alternativa possível é
Isso corresponderá a qualquer número começando com um caractere de espaço e um traço opcional e terminando no limite de uma palavra. Também corresponderá a um número começando no início da string.
fonte
Eu acho que é o limite (ou seja, o caractere a seguir) da última partida ou o começo ou o fim da string.
fonte
\G
: corresponde ao início da string (como\A
) na primeira tentativa de correspondência; depois disso, corresponde à posição em que a partida anterior terminou.quando você usa
\\b(\\w+)+\\b
isso significa correspondência exata com uma palavra que contém apenas caracteres de palavra([a-zA-Z0-9])
no seu caso, por exemplo, a configuração
\\b
no início do regex aceitará-12
(com espaço), mas novamente não aceitará-12
(sem espaço)para referência para apoiar minhas palavras: https://docs.oracle.com/javase/tutorial/essential/regex/bounds.html
fonte