1

StringTokenizer の代わりに正規表現を使用して文字列を分割したい。String.split(regex); を使用しています。正規表現にはメタ文字が含まれており、\[ を使用すると、配列を返すときに余分なスペースが返されます。

import java.util.Scanner;
public class Solution{
    public static void main(String[] args) {
        Scanner i= new Scanner(System.in);
        String s= i.nextLine();
        String[] st=s.split("[!\\[,?\\._'@\\+\\]\\s\\\\]+");
        System.out.println(st.length);
        for(String z:st)
            System.out.println(z);
        }
}

入力を入力する[a\m] と、配列の長さが3として返され、

 a m  

a の前にもスペースがあります。なぜこれが起こっているのか、どうすれば修正できるのか、誰でも説明できますか。結果の配列に余分なスペースは必要ありません。

4

2 に答える 2

2

Wiktor Stribiżew's answerへの追加として、java.util.regexパッケージを直接処理することで、パターンを 2 回指定することなく同じことを行うことができます。この冗長性を取り除くことで、潜在的なエラーを回避でき、パターンを 2 回解析する必要がないため、より効率的になる可能性もあります。

Pattern p = Pattern.compile("[!\\[,?\\._'@\\+\\]\\s\\\\]+");
Matcher m = p.matcher(s);
if(m.lookingAt()) s=m.replaceFirst("");
String[] st = p.split(s);
for(String z:st)
    System.out.println(z);

同じパターンを使用できるようにするため、つまりアンカーを使用し^て先頭の区切りを削除する必要がないようにするためlookingAt()に、最初に出現したパターンを削除する前に、テキストの先頭でパターンが本当に一致するかどうかを確認します。次に、split操作を続行しますが、既に準備された を再利用しPatternます。


コメントで言及されている問題に関してsplit、文字列が空の場合でも、一致がない場合、操作は常に少なくとも 1 つの要素、入力文字列を返します。空の配列が必要な場合、唯一の解決策は結果を明示的に置き換えることです。

if(st.length==1 && s.equals[0]) st=new String[0];

または、空の文字列を特別に扱いたい場合は、事前にこれを確認できます。

if(s.isEmpty()) st=new String[0];
else {
  // the code as shown above
}
于 2016-01-20T19:24:42.750 に答える