27

次のようなデータを含むファイルがあります。

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

私のソースコードは次のとおりです。

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();
} 

分割するsysCallName.split(",")と正常に動作しますが、上記のように使用すると、次の例外がスローされます。

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)

私が間違っていることについて何か考えはありますか?

4

9 に答える 9

59

開き角かっこをエスケープする必要があります。

sysCallName.split("\\(");

split()は正規表現を期待し、括弧は正規表現内のキャプチャグループをマークするために使用されるためです。したがって、それらはペアである必要があります。ブラケットが必要な場合は、エスケープする必要があります。

于 2012-12-19T09:04:53.547 に答える
17

String#split分割基準として正規表現を取ります。現在、(正規表現はグループのキャプチャに使用されているため、一致させる場合はエスケープする必要があります。

2つの方法があります:-

  1. ブラケットをエスケープします:-

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

    sysCallName.split("[(]");
    

文字クラスでは、すべてのメタ文字は特別な意味を失います。したがって、a(は単なる、(であり、adot(.)は単なるdot(.)。です。個人的には、2番目のオプションの方が明確に見えるので、私は2番目のオプションを好みます。

于 2012-12-19T09:07:43.307 に答える
6

文字列をエスケープします。それ以外の

sysCallName.split("(");

試す

sysCallName.split("\\(");
于 2012-12-19T09:04:24.620 に答える
5

エスケープ文字を追加する必要があります。

String[] sysCallTokens = sysCallName.split("\\(");
于 2012-12-19T09:05:07.183 に答える
4

(正規表現の予約文字です

これを修正するには、前に円記号を付けます。\(

于 2012-12-19T09:04:32.813 に答える
4

特殊文字で分割しようとしている間、特殊文字で使用する必要があり\\ます。だからここでこのようにしてみてください

sysCallName.split("\\(");

ここから他の特殊文字との分割文字列を見つけることができます

于 2012-12-19T09:07:38.317 に答える
3

コードでこの行を使用してみてください

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

(開き角かっこの前にエスケープ文字を追加しただけです)

于 2012-12-19T09:06:32.093 に答える
3

次のようにPattern.quoteを試すことができます。

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

特殊文字を使用して文字列を分割する場合は、上記の方法を使用できます。

于 2012-12-19T09:36:58.503 に答える
1

配列のようにデータを取得できます。

String[] result = line.split("\\\\(")[1].split("\\\\)").split(",");
于 2015-07-21T14:29:16.470 に答える