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

1

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

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"
Теги:
string
arrays

4 ответа

2
Лучший ответ

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

Вы можете сделать это:

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 будут все элементы, у которых в них нет алфавитных символов.

  • 1
    это не будет соответствовать "123abass; [; []" :)
  • 0
    @Quincunx спасибо за объяснение как для массива, так и для строки!
Показать ещё 9 комментариев
0

Вы можете использовать.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();

Это метод containsOnlyLetters:

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

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

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

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

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
  • 0
    в моем случае, если в массиве есть слово типа «123abass; [; [] _», оно должно быть полностью исключено, а не обрезано из «плохих» символов.
  • 0
    @ user3383621 - проверьте мой отредактированный ответ.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню