22

String[]Javaからアルファベット以外の文字をすべて削除してから、文字列を小文字の文字列に変換するメソッドを作成しようとしています。正規表現を使用して、アルファベット以外のすべての文字の出現をに置き換えようとしましたが、""取得した出力ではこれを行うことができません。これがコードです

static String[] inputValidator(String[] line) {
    for(int i = 0; i < line.length; i++) {
       line[i].replaceAll("[^a-zA-Z]", "");
       line[i].toLowerCase();
    }
    return line;
}

ただし、アルファベット以外の入力(たとえば-、または.)を指定しようとすると、出力も削除されないため、それらで構成されます。

入力例

A dog is an animal. Animals are not people.

私が得ている出力

A
dog
is
an
animal.
Animals
are
not
people.

期待される出力

a
dog
is
an
animal
animals
are
not
people
4

9 に答える 9

47

問題は、文字列が不変であるため、変更が保存されないことです。各メソッド呼び出しは、現在の値が同じStringままで、変更を表すnewを返します。返されたものを配列Stringに格納するだけです。String

line[i] = line[i].replaceAll("[^a-zA-Z]", "");
line[i] = line[i].toLowerCase();

各メソッドはを返すため、Stringメソッド呼び出しをチェーン化できます。これにより、最初の結果に対して2番目のメソッド呼び出しが実行され、1行で両方のアクションを実行できるようになります。

line[i] = line[i].replaceAll("[^a-zA-Z]", "").toLowerCase();
于 2012-06-22T03:24:54.520 に答える
7

正規表現の結果をlines[i]に戻す必要があります。

for ( int i = 0; i < line.length; i++) {
  line[i] = line[i].replaceAll("[^a-zA-Z]", "").toLowerCase();
}
于 2012-06-22T03:25:39.267 に答える
3

文字列は不変であるため機能しません。たとえば、値を設定する必要があります。

line[i] = line[i].toLowerCase(); 
于 2012-06-22T03:24:30.953 に答える
3

Javaは不変であるため、結果を再割り当てしてにtoLowerCase()戻すreplaceAll()必要があります(Javaの内部値は変更されず、クラスのメソッドはオブジェクトを変更する代わりに新しいオブジェクトを返します)。line[i]StringStringStringString

于 2012-06-22T03:24:39.563 に答える
1

やりたいことを実行するクールな (ただし、キャストが嫌いな場合は少し面倒な) 方法は、文字列全体をインデックスごとに調べ、各結果を String.charAt(index) から (byte) にキャストし、次に、そのバイトが a) 小文字のアルファベット文字の数値範囲 (a = 97 から z = 122) にあるかどうかを確認します。 -have-you、または b) 大文字のアルファベット文字の数値範囲 (A = 65 から Z = 90) で、この場合は 32 (A + 22 = 65 + 32 = 97 = a) を追加し、それをにキャストします。 char を追加して追加します。これらの範囲のいずれにもない場合は、単純に破棄します。

于 2012-06-22T03:36:55.500 に答える
1

これにも使用できますArrays.setAll

Arrays.setAll(array, i -> array[i].replaceAll("[^a-zA-Z]", "").toLowerCase());
于 2018-09-19T06:51:28.427 に答える
0

public static void solve(文字列行){

    // trim to remove unwanted spaces
    line= line.trim();

    String[] split = line.split("\\W+");

    // print using for-each
    for (String s : split) {
        System.out.println(s);
    }
于 2021-06-07T03:50:06.360 に答える