Как исключить из строки слова, содержащие не алфавитные символы

Например, если я хочу удалить не алфавитные символы, я бы сделал:

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

Как полностью исключить слово с неалфавитным символом из строки?

Например: Первоначальный ввод:

"a cat jumped jumped; on the table"

Следует исключить "прыгнул"; потому что ";".

Выход:

"a cat jumped on the table"

4 ответа

Решение

Изменить: (в ответ на ваше изменение)

Вы могли бы сделать это:

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

Давайте разберем регулярное выражение:

  • (^| ) соответствует после начала слова, либо после пробела, либо после начала строки.
  • [^ ]* соответствует любой последовательности, включая пустую строку, не пробелов (потому что пробелы разбивают слово)
  • [^A-Za-z ] проверяет, не является ли символ не алфавитным и не разбивает ли строку.
  • Наконец, нам нужно добавить [^ ]* чтобы он соответствовал до конца слова.
  • (?=$| ) соответствует концу слова, либо концу строки, либо следующему пробелу, но не занимает следующий пробел, поэтому последовательные слова все равно будут совпадать (т.е. "I want to say hello, world! everybody" становится "I want to say everybody")

Примечание: если "a cat jumped off the table." должен выводить "a cat jumped off the table", затем используйте это:

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

Предполагая, что у вас есть 1 слово на элемент массива, вы можете сделать это, чтобы заменить их пустой строкой:

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

И ArrayList будет иметь все элементы, которые не имеют не алфавитных символов в них.

Попробуй это:

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

Он объединяет массив с пробелами, а затем применяет регулярное выражение. Регулярное выражение ищет разрыв слова (\b), затем слово, содержащее хотя бы один несловесный символ (\w*\W+\w*), а затем слово "разрыв" в конце (не сопоставляется, все равно будет пробел). split разбивает строку в массив.

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

Вы можете использовать.toLowerCase() для каждого значения в массиве, а затем искать в массиве по значениям az, и это будет быстрее, чем регулярное выражение. Предположим, что ваши значения находятся в массиве с именем "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();

Это метод содержит OnlyLetters:

boolean containsOnlyLetters(String input) {
  char[] inputLetters = input.toLowerCase().toCharArray();
  for(char c : inputLetters) {
    if(c < 'a' || c > 'z') {
      return false;
    }
  }
  return true;
}
Другие вопросы по тегам