Meta-caractere Java RegEx (.) E ponto comum?

150

No Java RegEx, como descobrir a diferença entre .(ponto) o meta caractere e o ponto normal, como usamos em qualquer frase. Como lidar com esse tipo de situação para outros personagens meta também como ( *, +, \d, ...)

JavaUser
fonte

Respostas:

276

Se você deseja que o ponto ou outros caracteres com um significado especial nas expressões regulares seja um caractere normal, é necessário escapá-lo com uma barra invertida. Como as expressões regulares em Java são cadeias Java normais, é necessário escapar da barra invertida, então você precisa de duas barras invertidas, por exemplo\\.

Fabian Steeg
fonte
1
essa correção também se aplica a festa
krivar
18
Esteja ciente de que a fuga da barra invertida depende de como você está fornecendo a regex. se for codificado, você precisará usar: "\\." , se estiver lendo de uma fonte bruta (por exemplo, arquivo de texto), use apenas uma barra invertida: \.
Paul
25

As soluções propostas pelos outros membros não funcionam para mim.

Mas eu encontrei isso:

escapar de um ponto em java regexp write [.]

Kael
fonte
2
Mesmo, \\.não funcionou para mim: \.se queixou de que .não precisa ser escapado, \\.fez pensar que era \., em vez de ., \\\.eo construtor jogou um erro, [.]foi a única coisa que funcionou.
mithunc
1
@mithunc Isso é estranho, \\.dentro de uma string literal dá a você o \.que o regex precisa para ver o ponto como um ponto literal, em vez de qualquer caractere correspondente.
Klaar
16

Expressões regulares no estilo Perl (nas quais o mecanismo regex Java se baseia mais ou menos) tratam os seguintes caracteres como caracteres especiais:

.^$|*+?()[{\tem significado especial fora das classes de personagens

]^-\tem um significado especial dentro das classes de caracteres ( [...]).

Portanto, você precisa escapar desses (e apenas esses) símbolos, dependendo do contexto (ou, no caso de classes de caracteres, colocá-los em posições onde eles não possam ser mal interpretados).

Escapar desnecessariamente de outros caracteres pode funcionar, mas alguns mecanismos de expressão regular tratam isso como erros de sintaxe, por exemplo \_, causarão um erro no .NET.

Alguns outros levarão a resultados falsos, por exemplo, \<é interpretado como um literal <em Perl, mas egrepsignifica "limite de palavras".

Portanto, escreva -?\d+\.\d+\$para combinar 1.50$, -2.00$etc. e [(){}[\]]para uma classe de caractere que corresponda a todos os tipos de colchetes / chaves / parênteses.

Se você precisar transformar uma sequência de entrada do usuário em um formato seguro para regex, use java.util.regex.Pattern.quote.

Leitura adicional: RegexGuru, blog de Jan Goyvaert, sobre como escapar de metacaracteres

Tim Pietzcker
fonte
4

Escape de caracteres especiais com uma barra invertida. \., \*, \+, \\d, E assim por diante. Se você não tiver certeza, poderá escapar de qualquer caractere não alfabético, seja ele especial ou não. Consulte o javadoc para java.util.regex.Pattern para obter mais informações.

Christoffer Hammarström
fonte
Escolher caracteres não especiais desnecessariamente pode funcionar em alguns idiomas, mas pode falhar em outros, por isso é melhor não adquirir o hábito.
precisa saber é o seguinte
1
Porém, esta pergunta é especificamente sobre Java e docs.oracle.com/javase/6/docs/api/java/util/regex/… diz "Uma barra invertida pode ser usada antes de um caractere não alfabético, independentemente de esse caractere ser parte de uma construção sem escape ".
Christoffer Hammarström
2

Aqui está o código que você pode copiar e colar diretamente:

String imageName = "picture1.jpg";
String [] imageNameArray = imageName.split("\\.");
for(int i =0; i< imageNameArray.length ; i++)
{
   system.out.println(imageNameArray[i]);
}

E se por engano houver espaços deixados antes ou depois de "." em tais casos? É sempre uma boa prática considerar esses espaços também.

String imageName = "picture1  . jpg";
String [] imageNameArray = imageName.split("\\s*.\\s*");
    for(int i =0; i< imageNameArray.length ; i++)
    {
       system.out.println(imageNameArray[i]);
    }

Aqui, \\ s * existe para considerar os espaços e fornecer apenas as strings divididas necessárias.

Vyankatesh S Repal
fonte
1

Queria corresponder uma string que termina com ". *" Para isso, tive que usar o seguinte:

"^.*\\.\\*$"

Meio bobo se você pensar bem: D Aqui está o que isso significa. No início da string, pode haver qualquer caractere zero ou mais vezes, seguido de um ponto "." seguido por uma estrela (*) no final da string.

Espero que isso seja útil para alguém. Obrigado pela coisa de barra invertida para Fabian.

Atspulgs
fonte
Basta usar "\\.\\*$"então. Não há necessidade de corresponder ao início da string, se isso não for importante para você.
Ofidiana
Sim você está correto. Para ser sincero, não consigo me lembrar do caso de uso para isso: /
Atspulgs
Realmente não era para ajudá-lo, mas para ajudar outras pessoas a olhar para o seu post: P
Ophidian
0

Se você quiser terminar, verifique se a sua frase termina com ". ", Então você deve adicionar [\. \ ] $ Ao final do seu padrão.

Madhu Gogineni
fonte
0

Estou fazendo uma matriz básica no JGrasp e descobri que, com um método acessador, uma matriz char [] [] usa ('.') Para colocar um único ponto.

rgm
fonte