web-dev-qa-db-fra.com

erreur string.parse ("("))

J'ai un fichier qui contient des données comme suit:

recv(1178884, NULL, 4294967267, 0)      = 0
......
......

Mon code source est:

try (BufferedReader br = new BufferedReader(new FileReader("D:\\smsTrace.txt"))) {
    String sCurrentLine;

    while ((sCurrentLine = br.readLine()) != null) {
        String sysCallName = sCurrentLine;
        String[] sysCallTokens = sysCallName.split("(");
        System.out.println(sCurrentLine);
    }
} catch (IOException e) {
    e.printStackTrace();
} 

Quand je me sépare avec sysCallName.split(",") cela fonctionne bien, mais lorsque j'utilise comme ci-dessus, il lève l'exception suivante.

Exception in thread "main" Java.util.regex.PatternSyntaxException: Unclosed group near index 1
(
 ^
    at Java.util.regex.Pattern.error(Unknown Source)
    at Java.util.regex.Pattern.accept(Unknown Source)
    at Java.util.regex.Pattern.group0(Unknown Source)
    at Java.util.regex.Pattern.sequence(Unknown Source)
    at Java.util.regex.Pattern.expr(Unknown Source)
    at Java.util.regex.Pattern.compile(Unknown Source)
    at Java.util.regex.Pattern.<init>(Unknown Source)
    at Java.util.regex.Pattern.compile(Unknown Source)
    at Java.lang.String.split(Unknown Source)
    at Java.lang.String.split(Unknown Source)
    at fileReading.main(fileReading.Java:19)

Une idée de ce que je fais mal?

23
Junaid

Vous devez échapper à la parenthèse d'ouverture:

sysCallName.split("\\(");

Parce que split() s'attend à une expression régulière et que des crochets sont utilisés pour marquer les groupes capturés dans une expression régulière. Donc, ils doivent être deux par deux. Si vous voulez juste un crochet, il faut l’échapper.

49
jlordo

String#split prend une expression régulière en tant que critère de division. Maintenant, ( dans regex est utilisé pour capturer des groupes, vous devez donc l’échapper si vous voulez le faire correspondre.

Vous avez deux moyens: -

  1. Échapper le support: -

    sysCallName.split("\\(");
    
  2. Utilisez Character class: -

    sysCallName.split("[(]");
    

Dans une classe de caractères, tous les méta-caractères perdent leur signification particulière, de sorte qu'un ( est simplement un ( et qu'un dot(.) est simplement un dot(.). Personnellement, je préfère la deuxième option, car elle semble plus claire.

16
Rohit Jain

échapper à votre chaîne. au lieu de 

sysCallName.split("(");

essayer 

sysCallName.split("\\(");
6
gefei

Vous devez ajouter un caractère d'échappement:

String[] sysCallTokens = sysCallName.split("\\(");
5
Luca Davanzo

( est un caractère réservé aux expressions régulières

Vous pouvez résoudre ce problème en le préfixant avec une barre oblique inverse: \(

4
Arcturus

Lorsque vous essayez de scinder avec des caractères spéciaux, vous devez utiliser \\ avec votre caractère spécial. alors voici essayer comme ça

sysCallName.split("\\(");

vous pouvez trouver des chaînes de fractionnement avec d'autres caractères spéciaux de ici

4
Ram kiran

Essayez d'utiliser cette ligne dans votre code

String[] sysCallTokens = sysCallName.split("\\(");

(Juste ajouté le caractère d'échappement avant le support d'ouverture)

3
TechnoCrat

Vous pouvez essayer Pattern.quote comme:

sysCallName.split(Pattern.quote(")"));

Si vous souhaitez scinder une chaîne à l'aide de caractères spéciaux, vous pouvez utiliser la méthode ci-dessus.

3
Rajshri

Vous pouvez récupérer les données comme s'il s'agissait d'un tableau:

String[] result = line.split("\\\\(")[1].split("\\\\)").split(",");
1
Endorox

@Endorox votre extrait de code est incomplet. Merci quand même, ça m'a aidé. 

    String[] sysCallTokens = sysCallName.split("\\(")[1].split("\\)")
    [0].split(",");

Explication: D'abord, nous divisons la chaîne entière en deux où (est le diviseur. Nous voulons tout ignorer, nous prenons donc [1] ou le deuxième index des deux index générés à la suite de la scission. utilisé // comme caractère d'échappement, ce qui nous aide à utiliser (comme paramètre split. 

De même, nous divisons le reste avec) puis avec une virgule (,). 

0
Monir