74 votes

Expression régulière pour la mise en correspondance des parenthèses

Quelle est l'expression régulière permettant de faire correspondre '(' dans une chaîne de caractères ?

Voici le scénario :

J'ai une chaîne

str = "abc(efg)";

Je veux diviser la chaîne de caractères à '(' en utilisant une expression régulière. Pour cela, j'utilise

Arrays.asList(Pattern.compile("/(").split(str))

Mais j'obtiens l'exception suivante.

java.util.regex.PatternSyntaxException: Unclosed group near index 2
/(

Échapper à '(' ne semble pas fonctionner.

1 votes

Vous devez d'abord apprendre les bases de Regex : Wiki Regex o Tutoriels Regex o Regex pour les débutants

9 votes

Essayez Pattern.quote("(") ou simplement "\\(" . Notez qu'il y a deux barres obliques inversées - une supplémentaire pour le compilateur Java, afin de comprendre la chaîne correctement. Votre exemple de code utilise une barre oblique, et non une barre oblique inversée. Plus important encore, vous pouvez simplement utiliser string.split ...

0 votes

"\(" a fonctionné pour moi, grâce à @Kobi.

122voto

Spudley Points 85371

Deux options :

Tout d'abord, vous pouvez l'échapper en utilisant un arrière slash -- \(

Sinon, comme il s'agit d'un caractère unique, vous pouvez le placer dans une classe de caractères, où il n'a pas besoin d'être échappé [(]

7voto

Kobi Points 65357
  • Vous pouvez échapper à n'importe quel méta-caractère en utilisant une barre oblique inverse, de sorte que vous pouvez faire correspondre ( avec le motif \( .
  • De nombreux langages sont dotés d'une fonction d'échappement intégrée, par exemple, la fonction d'échappement de .Net. Regex.Escape ou de Java Pattern.quote
  • Certaines saveurs supportent \Q y \E avec un texte littéral entre les deux.
  • Certaines saveurs (VIM, par exemple) font correspondre ( littéralement, et exigent \( pour capturer des groupes.

Voir aussi : Expression régulière - Référence syntaxique de base

6voto

La solution consiste en un motif regex correspondant aux parenthèses ouvertes et fermées.

String str = "Your(String)";
// parameter inside split method is the pattern that matches opened and closed parenthesis, 
// that means all characters inside "[ ]" escaping parenthesis with "\\" -> "[\\(\\)]"
String[] parts = str.split("[\\(\\)]");
for (String part : parts) {
   // I print first "Your", in the second round trip "String"
   System.out.println(part);
}

En écrivant dans le style de Java 8, ce problème peut être résolu de la manière suivante :

Arrays.asList("Your(String)".split("[\\(\\)]"))
    .forEach(System.out::println);

J'espère que c'est clair.

3 votes

Une explication de ce qui se passe ici améliorerait cette réponse. Si le PO ne savait pas comment faire, il y a de fortes chances qu'il ne comprenne pas non plus votre solution. En général, les réponses consistant uniquement en du code ou des liens ne sont pas de bonnes réponses.

3voto

Pour tout caractère spécial, vous devez utiliser "\". Ainsi, pour faire correspondre des parenthèses - /\(/)

1voto

kurumi Points 10096

Parce que ( est spécial en regex, vous devez l'échapper. \( lors de la correspondance. Cependant, selon la langue que vous utilisez, vous pouvez facilement faire correspondre ( avec des méthodes de chaîne comme index() ou d'autres méthodes qui vous permettent de trouver à quelle position le ( est en place. Parfois, il n'est pas nécessaire d'utiliser une expression rationnelle.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X