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?
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.
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: -
Échapper le support: -
sysCallName.split("\\(");
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.
échapper à votre chaîne. au lieu de
sysCallName.split("(");
essayer
sysCallName.split("\\(");
Vous devez ajouter un caractère d'échappement:
String[] sysCallTokens = sysCallName.split("\\(");
(
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: \(
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
Essayez d'utiliser cette ligne dans votre code
String[] sysCallTokens = sysCallName.split("\\(");
(Juste ajouté le caractère d'échappement avant le support d'ouverture)
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.
Vous pouvez récupérer les données comme s'il s'agissait d'un tableau:
String[] result = line.split("\\\\(")[1].split("\\\\)").split(",");
@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 (,).