如何从字符串中排除具有非字母字符的单词

时间:2014-03-19 16:54:36

标签: java arrays string non-alphanumeric

例如,如果我想删除非字母字符,我会这样做:

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

如何从字符串中完全排除带有非字母字符的单词?

例如: 初始输入:

"a cat jumped jumped; on the table"

它应该排除&#34;跳跃;&#34;因为&#34;;&#34;。

输出:

"a cat jumped on the table"

4 个答案:

答案 0 :(得分:2)

修改(响应您的修改)

你可以这样做:

String input = "a cat jumped jumped; on the table";
input = input.replaceAll("(^| )[^ ]*[^A-Za-z ][^ ]*(?=$| )", "");

让我们打破正则表达式:

  • (^| )在单词开头之后,在空格之后或字符串开头之后匹配。
  • [^ ]*匹配非空格的任何序列,包括空字符串(因为空格会破坏单词)
  • [^A-Za-z ]检查字符是否为非字母字符,并且不会破坏字符串。
  • 最后,我们需要附加[^ ]*以使其匹配,直到该词的结尾。
  • (?=$| )匹配单词的结尾,无论是字符串的结尾还是下一个空格字符,但它不会消耗下一个空格,因此连续的单词仍然匹配(即{{1} }变成"I want to say hello, world! everybody"

注意:如果"I want to say everybody"输出"a cat jumped off the table.",请使用以下内容:

"a cat jumped off the table"

假设每个数组元素有1个单词,可以用空字符串替换它们:

input = input.replaceAll(" [^ ]*[^A-Za-z ][^ ]*(?= )", "").replaceAll("[^A-Za-z]$", "");

如果您确实要将其删除,请考虑使用for (String string: s) { if (s.matches(".*[^A-Za-z].*") { s = ""; } }

ArrayList

ArrayList<String> stringList = new ArrayList<>(); for (int index = 0; index < s.length; index++) { if (s[index].matches(".*[^A-Za-z].*") { stringList.add(s[index]); } } 将包含所有不包含非字母字符的元素。

答案 1 :(得分:0)

试试这个:

s = s[i].join(" ").replaceAll("\\b\\w*\\W+\\w*(?=\\b)", "").split(" ");

它使用空格连接数组,然后应用正则表达式。正则表达式查找单词分隔符(\b),然后查找包含至少一个非单词字符(\w*\W+\w*)的单词,然后在结尾处查找单词(不匹配,仍然会有空间)。 split将字符串拆分为数组。

答案 2 :(得分:0)

public static void main(String[] args) throws ClassNotFoundException {
    String str[] ={ "123abass;[;[]","abcde","1234"};
    for(String s : str)
    {
        if(s.matches("^[a-zA-Z]+$")) // should start and end with [a-zA-Z]
        System.out.println(s);
    }

O/P : abcde

答案 3 :(得分:0)

您可以对数组中的每个值使用.toLowerCase(),然后针对a-z值搜索数组,它将比正则表达式更快。假设您的值位于名为“myArray”的数组中。

List<String> newValues = new ArrayList<>();
for(String s : myArray) {
  if(containsOnlyLetters(s)) {
    newValues.add(s);
  }
}
//do this if you have to go back to an array instead of an ArrayList
String[] newArray = (String[])newValues.toArray();

这是containsOnlyLetters方法:

boolean containsOnlyLetters(String input) {
  char[] inputLetters = input.toLowerCase().toCharArray();
  for(char c : inputLetters) {
    if(c < 'a' || c > 'z') {
      return false;
    }
  }
  return true;
}