Pergunta

Em Java, suponha que eu tenho uma variável String S, e eu quero procurá-lo dentro de outro T String, assim:

   if (T.matches(S)) ...

(nota:.. A linha acima foi T.contains () até alguns posts apontou que esse método não usa expressões regulares My bad)

Mas agora S suponha que pode ter personagens desagradáveis ??nele. Por exemplo, vamos S = "[oi". O colchete esquerdo vai fazer com que a regex a falhar. Existe uma função que eu posso chamar para escapar S para que isso não aconteça? Neste caso particular, eu gostaria que ele seja transformado em "\ [oi".

Foi útil?

Solução

não String.Contains não usar regex, então não é um problema neste caso.

Se for exigido um regex, em vez rejeitando cordas com caracteres especiais regex, use java.util.regex.Pattern.quote para escapar deles.

Outras dicas

Como Tom Hawtin disse, é preciso citar o padrão. Você pode fazer isso de duas maneiras (Edit: Na verdade três formas, como fora apontado por @ diastrophism ):

  1. Surround a corda com "\ Q" e "\ E", como:

    if (T.matches("\\Q" + S + "\\E"))
    
  2. Use Padrão em seu lugar. O código seria algo parecido com isto:

    Pattern sPattern = Pattern.compile(S, Pattern.LITERAL);
    if (sPattern.matcher(T).matches()) { /* do something */ }
    

    Desta forma, você pode armazenar em cache o padrão compilado e reutilizá-lo. Se você estiver usando o mesmo regex mais de uma vez, você quase certamente deseja fazê-lo desta forma.

Note que se você estiver usando expressões regulares para testar se uma string está dentro de uma seqüência maior, você deve colocar. * No início e no fim da expressão. Mas isso não vai funcionar se você está citando o padrão, uma vez que será, então, à procura de pontos reais. Então, você está absolutamente certo de que você quer ser usando expressões regulares?

Tente Pattern.quote (string) . Ele irá corrigir-se qualquer coisa que tem um significado especial na cadeia.

Alguma razão especial para não usar String.indexOf () em vez disso? Dessa forma, ele vai sempre ser interpretada como uma seqüência regular em vez de um regex.

Regex usa o caractere de barra invertida '\' para escapar de um literal. Dado que java também usa o caractere de barra invertida você precisa usar um double bashslash como:

   String S = "\\[hi"

que se tornará a Cadeia:

  \[hi

que será passado para o regex.

Ou se você só se preocupam com uma String literal e não precisa de um regex que você poderia fazer o seguinte:

if (T.indexOf("[hi") != -1)  {

T.contains () (de acordo com javadoc: http://java.sun.com/javase/6/docs/api/java/lang/String.html ) não usa expressões regulares. contains () delegados para indexOf () somente.

Assim, não há expressões regulares usados ??aqui. você estava pensando em algum outro método de Cordas?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top