2010-10-28 6 views
7

Je ne travaille pas ce regex qui est censé enlever délimiteurs phrase (. et ?):simple Java regex

sentence = sentence.replaceAll("\\.|\\?$",""); 

Il fonctionne très bien, il convertit

"I am Java developer." à "I am Java developer"

"Am I a Java developer?" à "Am I a Java developer"

Mais après le déploiement w e trouve qu'il remplace également tous les autres points dans la phrase comme

"Hi.Am I a Java developer?" devient "HiAm I a Java developer"

Pourquoi est-ce qui se passe?

Répondre

14

Le pipe (|) a la priorité la plus faible de tous les opérateurs. Ainsi, votre regex:

\\.|\\?$ 

est traité comme:

(\\.)|(\\?$) 

qui correspond à un .partout dans la chaîne et correspond à un ? à la fin de la chaîne.

Pour résoudre ce problème, vous devez regrouper les . et ? ensemble comme:

(?:\\.|\\?)$ 

Vous pouvez également utiliser:

[.?]$ 

Au sein d'une classe de caractères . et ? sont littéralement traités si vous avez besoin pas leur échapper.

+0

Merci pour l'explication claire. Ça fonctionne maintenant. – user489849

+1

+1 Bonne explication. – jensgram

+1

Quand vous remerciez quelqu'un, vérifiez sa réponse comme utile, c'est un minimum ;-). +1 pour l'explication détaillée –

3

Vous avez oublié d'embrasser les personnages de phrases se terminant par-parenthèses:

sentence = sentence.replaceAll("(\\.|\\?)$",""); 

La meilleure approche consiste à utiliser [.?]$ comme Byers @ Mark suggéré.

sentence = sentence.replaceAll("[.?]$",""); 
7

Votre problème est dû à la faible precedence du alternation operator|. Votre expression régulière signifie correspondre à l'un:

  • . partout ou
  • ? à la fin d'une ligne.

Utilisez une classe de caractères à la place:

"[.?]$" 
8

Ce que vous dites avec "\\.|\\?$" est « soit une période » ou « un point d'interrogation que le dernier caractère ».

Je recommanderais "[.?]$" à la place afin d'éviter la confusion dérobant (et le résultat indésirable, bien sûr).

+0

Pas le seul avec cette idée, il semble :) – jensgram

+1

+1 pour aligner les scores avec Mark Byers, car ils sont les mêmes réponses: p –