Например, если я хочу удалить неалфавитные символы, которые я сделал бы:
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 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
будут все элементы, у которых в них нет алфавитных символов.
Вы можете использовать.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;
}
Попробуй это:
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