从java中的String数组中删除所有非字母字符

时间:2012-06-22 03:21:35

标签: java regex string

我正在尝试编写一个方法,从Java String[]中删除所有非字母字符,然后将String转换为小写字符串。我已经尝试使用正则表达式来替换""所有非字母字符的出现。但是,我得到的输出无法这样做。这是代码

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

9 个答案:

答案 0 :(得分:37)

问题是您的更改未被存储,因为字符串为immutable。每个method calls都会返回一个代表更改的新String,当前String保持不变。您只需将返回的String存储回数组中。

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

因为每个方法都返回String,所以您可以将方法调用链接在一起。这将对第一个结果执行第二个方法调用,允许您在一行中执行两个操作。

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

答案 1 :(得分:5)

您需要将正则表达式的结果分配回行[i]。

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

答案 2 :(得分:2)

它不起作用,因为字符串是不可变的,您需要设置一个值 e.g。

line[i] = line[i].toLowerCase(); 

答案 3 :(得分:2)

您必须将toLowerCase()replaceAll()的结果重新分配回line[i],因为Java String是不可变的(其内部值永远不会更改,以及String中的方法1}}类将返回一个新的String对象,而不是修改String对象。)

答案 4 :(得分:2)

这是工作方法

public static void quickSort(List<Comparable> nums, int first, int last) {
    int low = first;
    int high = last;
    int midIndex = (first + last) / 2;
    Comparable midValue = nums.get(midIndex);

    while(low < high) {
        while (nums.get(low).compareTo(midValue) < 0) {
              low++;
        }
        while (nums.get(high).compareTo(midValue) > 0) {
              high--;
        }
        if (low <= high) {
            swap(nums, low, high);
            low++;
            high--;
        }
    }
    if (high > first)
           quickSort(nums, first, high);
    if (low < last)
           quickSort(nums, low, last);
    }

答案 5 :(得分:1)

很酷(但有点麻烦,如果你不喜欢投射)做你想做的事情的方法是遍历整个字符串,索引索引,将每个结果从String.charAt(index)转换为(byte) ),然后检查该字节是否是a)在小写字母字符的数值范围内(a = 97到z = 122),在这种情况下将其强制转换为char并将其添加到String,array ,或者你有什么,或者b)在大写字母字符的数值范围内(A = 65到Z = 90),在这种情况下加32(A + 22 = 65 + 32 = 97 = a)和将其转换为char并将其添加。如果它不在这两个范围内,只需丢弃它。

答案 6 :(得分:1)

正如它已经回答的那样,只想再分享一个未提及的方式&gt;

 str = str.replaceAll("\\P{Alnum}", "").toLowerCase();

答案 7 :(得分:0)

您也可以使用Arrays.setAll

Arrays.setAll(array, i -> array[i].replaceAll("[^a-zA-Z]", "").toLowerCase());

答案 8 :(得分:0)

public static void solve(String line){

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