Java string убрать знаки препинания

Эффективное удаление определенных символов (некоторые знаки пунктуации) из строк в Java?

В Java, каков наиболее эффективный способ удаления данных символов из строки? В настоящее время у меня есть этот код:

private static String processWord(String x) < String tmp; tmp = x.toLowerCase(); tmp = tmp.replace(",", ""); tmp = tmp.replace(".", ""); tmp = tmp.replace(";", ""); tmp = tmp.replace("!", ""); tmp = tmp.replace("?", ""); tmp = tmp.replace("(", ""); tmp = tmp.replace(")", ""); tmp = tmp.replace("", ""); tmp = tmp.replace("[", ""); tmp = tmp.replace("]", ""); tmp = tmp.replace("", ""); tmp = tmp.replace("%", ""); return tmp; > 

Было бы быстрее, если бы я использовал какой-то StringBuilder, или регулярное выражение, или, может быть, что-то еще? Да, я знаю: профилируйте это и посмотрите, но я надеюсь, что кто-то может дать ответ макушки, так как это обычная задача.

7 ответов

Вот поздний ответ, просто для удовольствия.

В таких случаях я бы предложил стремиться к удобочитаемости, а не к скорости. Конечно, вы можете быть суперчитабельным, но слишком медленным, как в этой суперкомпактной версии:

private static String processWord(String x) < return x.replaceAll("[][()<>,.;!?<>%]", ""); > 

Это медленно, потому что каждый раз, когда вы вызываете этот метод, регулярное выражение будет компилироваться. Таким образом, вы можете предварительно скомпилировать регулярное выражение.

private static final Pattern UNDESIRABLES = Pattern.compile("[][()<>,.;!?<>%]"); private static String processWord(String x)

Это должно быть достаточно быстрым для большинства целей, предполагая, что механизм регулярных выражений JVM оптимизирует поиск класса символов. Это решение, которое я бы использовал лично.

Читайте также:  Save file php script

Теперь без профилирования я бы не знал, могли бы вы добиться большего успеха, создав таблицу поиска для своего собственного символа (на самом деле с кодовой точкой):

private static final boolean[] CHARS_TO_KEEP = new boolean[]; 

Заполните это один раз, а затем повторите, получая полученную строку. Я оставлю код для вас.:)

Опять же, я бы не стал погружаться в этот вид оптимизации. Код стал слишком сложным для чтения. Производительность так важна? Также помните, что современные языки JITted и после прогрева они будут работать лучше, поэтому используйте хороший профилировщик.

Одна вещь, которую следует упомянуть, это то, что пример в исходном вопросе крайне неэффективен, потому что вы создаете целую кучу временных строк! Если компилятор не оптимизирует все это, это конкретное решение будет работать хуже.

Источник

Как я могу удалить пунктуацию из входного текста в Java?

Я пытаюсь получить предложение с использованием ввода от пользователя в Java, и мне нужно сделать его строчным и удалить все знаки препинания. Вот мой код:

 String[] words = instring.split("\\s+"); for (int i = 0; i < words.length; i++) < words[i] = words[i].toLowerCase(); >String[] wordsout = new String[50]; Arrays.fill(wordsout,""); int e = 0; for (int i = 0; i < words.length; i++) < if (words[i] != "") < wordsout[e] = words[e]; wordsout[e] = wordsout[e].replaceAll(" ", ""); e++; >> return wordsout; 

Я не могу найти способ удалить все небуквенные символы. Я пробовал использовать регулярные выражения и итераторы без везения. Спасибо за любую помощь.

4 ответа

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

String[] words = instring.replaceAll("[^a-zA-Z ]", "").toLowerCase().split("\\s+"); 

Пространства сначала остаются на входе, поэтому раскол будет работать. Удаляя символы мусора перед расщеплением, вы избегаете прокрутки элементов.

@hendy да, «å» — это буква Unicode. Я ответил за латинский контекст. Чтобы обслужить любую букву, регулярное выражение будет «[^\\p ]» , которое использует нотацию POSIX для «буквы».

Интересно, должно ли понимание Unicode быть «практикой по умолчанию» для большинства / начинающих программистов? Я имею в виду, что американским / индонезийским программистам никогда не приходилось иметь дело со странными персонажами в их «реальной» жизни. Таким образом, их код, вероятно, отражает это, поэтому, хотя они используют UTF8, есть непреднамеренное предположение, что буквы являются AZ. Турецкий или арабский программист OTOH в первую очередь распознает этот сценарий и будет искать решение Unicode. Как вы думаете? (Это просто побочное обсуждение)

@ilija139 ilija139 конечно — все не буквы / пробелы удаляются на первом этапе. Чтобы сохранить цифры тоже, просто добавьте цифры к сохраняемым символам — т.е. измените на replaceAll(«[^a-zA-Z0-9 ]», «»)

Если вы не хотите использовать RegEx (что кажется крайне ненужным с учетом вашей проблемы), возможно, вам стоит попробовать что-то вроде этого:

public String modified(final String input)

Он проходит через базовый char[] в String и добавляет только char , если это буква или цифра (отфильтровать все символы, которые я принимаю, это то, что вы пытаетесь выполнить), а затем добавляет строчную версию char .

Вы можете попробовать следующее: —

Scanner scan = new Scanner(System.in); System.out.println("Type a sentence and press enter."); String input = scan.nextLine(); String strippedInput = input.replaceAll("\\W", ""); System.out.println("Your string: " + strippedInput); 
[^\w] соответствует символу без слова, поэтому приведенное выше регулярное выражение будет соответствовать и удалять все символы, отличные от слова.

@RohitJain:- — Да, я понял твою точку зрения. Но я подумал о пунктуации, которую мы часто использовали в языке. Я взял буквальное значение пунктуации .

Источник

Удаление знаков препинания из строки

Здравствуйте, в моем коде в массиве words по отдельности хранятся слова строки, но их разделение происходит по пробелу. Если после слова в строке будет стоять, например, запятая, то она тоже запишется в массив.
Подскажите пожалуйста, как это можно исправить.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
import java.util.HashMap; import java.util.Map; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.print("Введите строку: "); String input = scanner.nextLine(); System.out.print("Введите букву: "); char letter = scanner.next().charAt(0); String[] words = input.split("\\s+"); //записали строку в массив пословно MapString, Integer> wordCount = new HashMap<>(); for (String word : words) { int count = 0; for (int i = 0; i  word.length(); i++) { if (word.charAt(i) == letter) { count++; //в переменной count хранится количество повторений необходимой буква в слове } } wordCount.put(word, count); //в переменной wordCount хранится слово и соответствующее ему количество повторений } int maxCount = 0; for (int count : wordCount.values()) { //поочередно возвращает количество повторяющихся букв в каждом слове if (count > maxCount) { maxCount = count; } } System.out.print("Слова, где буква \"" + letter + "\" встречается наибольшее количество раз: "); for (Map.EntryString, Integer> entry : wordCount.entrySet()) { if (entry.getValue() == maxCount) { //если количество повторяющихся букв равно наибольшему значению повторений, System.out.print(entry.getKey() + " ");//то слово выводится } } } }

Строка: Из строки S создать строку без знаков препинания, состоящую из слов, которые начинаются с большой буквы
Добрый день, помогите пожалуйста с программой, буду очень благодарен. Строка S в которой слова.

Найти и вывести количество знаков препинания
Задание найти и вывести количество знаков препинания, что встречаются в тексте Помогите исправить.

Определить количество знаков препинания в предложении
С клавиатуры посимвольно вводится предложение. Определить количество знаков препинания в.

Лучший ответ

Сообщение было отмечено nz2003 как решение

Решение

ЦитатаСообщение от nz2003 Посмотреть сообщение

Источник

Эффективное удаление определенных символов (некоторые знаки пунктуации) из строк в Java?

В Java, что является наиболее эффективным способом удаления данных символов из строки? В настоящее время у меня есть этот код:

private static String processWord(String x) < String tmp; tmp = x.toLowerCase(); tmp = tmp.replace(",", ""); tmp = tmp.replace(".", ""); tmp = tmp.replace(";", ""); tmp = tmp.replace("!", ""); tmp = tmp.replace("?", ""); tmp = tmp.replace("(", ""); tmp = tmp.replace(")", ""); tmp = tmp.replace("", ""); tmp = tmp.replace("[", ""); tmp = tmp.replace("]", ""); tmp = tmp.replace("", ""); tmp = tmp.replace("%", ""); return tmp; > 

Было бы быстрее, если бы я использовал какой-то StringBuilder или регулярное выражение или, может быть, что-то еще? Да, я знаю: прокомментируйте это и посмотрите, но я надеюсь, что кто-то может дать ответ на верхушку головы, поскольку это общая задача.

В целом, Java Regex работает довольно хорошо, и если я не делал что-то очень чувствительное к производительности, я обычно просто использую «Я» и продолжаю. Также tmp.replaceAll («\\ W», «») избавит от пунктуации и пробелов в строке.

Запрос на уточнение: пожалуйста, определите, что вы подразумеваете под пунктуацией . Это только те персонажи, которые вы перечислили выше? Как насчет их тире? Как насчет фигурных цитат? А как насчет символов цитаты из неанглийских языков?

Следуйте этому в следующий раз, когда вы сможете найти решение относительно регулярных выражений самостоятельно.

@Pshemo ПРЯМОГО ответа там нет. Но это поможет понять, кроме копирования . и в следующий раз он может найти способ решить такие вещи. Я никогда не говорю, что будет ОТВЕТ. Я сказал, что это может помочь вам

7 ответов

Вот поздний ответ, просто для удовольствия.

В подобных случаях я бы предложил повысить читаемость по скорости. Конечно, вы можете быть суперчитабельными, но слишком медленными, как в этой супер-сжатой версии:

private static String processWord(String x) < return x.replaceAll("[][()<>,.;!?<>%]", ""); > 

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

private static final Pattern UNDESIRABLES = Pattern.compile("[][()<>,.;!?<>%]"); private static String processWord(String x)

Это должно быть достаточно быстро для большинства целей, предполагая, что движок JVM regex оптимизирует поиск класса символов. Это решение, которое я бы использовал лично.

Теперь без профилирования я не знаю, сможешь ли ты сделать лучше, создав таблицу собственных символов (фактически кодовую):

private static final boolean[] CHARS_TO_KEEP = new boolean[]; 

Заполните это один раз, а затем итерайте, создав свою итоговую строку. Я оставлю код вам.:)

Опять же, я бы не стал погружаться в такую ​​оптимизацию. Код стал слишком трудным для чтения. Является ли производительность такой проблемой? Также помните, что современные языки JITted, и после прогрева они будут работать лучше, поэтому используйте хороший профилировщик.

Одна вещь, о которой следует упомянуть, состоит в том, что пример в исходном вопросе очень неактивен, потому что вы создаете целую кучу временных строк! Если компилятор не оптимизирует все это, это конкретное решение будет наихудшим.

Это не совсем верно: приведенное регулярное выражение «[] [() <>,.;!? <>%]» Недопустимо, так как содержит специальные символы. Тем не менее, цитирование с \ Q и \ E работает хорошо: «» [\\ Q] [() <>,.;! <>% \\ E] «(обратная косая черта увеличилась вдвое из-за Java). Я собираюсь принять этот ответ, так как это тот, который я в конечном итоге использовал, и все альтернативы были четко объяснены, не говоря уже о том, что только точные упомянутые символы удаляются этим.

Отрицательные взгляды — отличное дополнение к этому, которое я нашел в этом ответе: stackoverflow.com/questions/9880941/… . Этот шаблон: «(?! [._]) \\ p » удаляет все знаки препинания в классе Punct, кроме ._ Это хорошо, если вы хотите удалить все знаки пунктуации, но сохранить несколько символов.

Хотя \\p будет указывать более широкий диапазон символов, чем в вопросе, он позволяет использовать более короткое замещающее выражение:

Источник

Как убрать все знаки препинания, кроме пробелов или чисел в Java

Как удалить все знаки препинания, кроме пробелов или чисел в Java.

"\\p|\\d", "" //THIS WORKS BUT IT REMOVES THE NUMBERS AND I DONT WANT IT TO REMOVE THE NUMBERS. 

Я читаю текст, и мне нужно удалить пунктуацию.

String[] internal; char ch = 'a'; int counter = 1; int count; int c; Map dictionary = new HashMap(); BufferedReader in = new BufferedReader(new FileReader("yu.txt")); while (in.ready()) < internal = (((in.readLine()).replaceAll("\\p|\\d", "")).toLowerCase()).split(" ");//this does not work in my case cause it removes numbers. and makes them whitespaces but other than that this one works I JUST dont want it to remove numbers and keep whitespaces. for (count = 0; count < internal.length; count++) < if (!dictionary.containsKey(internal[count])) < dictionary.put(internal[count], new HashSet()); >if (dictionary.get(internal[count]).size() <10) < dictionary.get(internal[count]).add(counter); >> counter++; > Iterator iterator = dictionary.keySet().iterator(); while (iterator.hasNext())

2 ответа

Я не знаю о существующем классе (по умолчанию), который может это сделать.

Вам нужно будет написать логику, которая будет проходить через символ String за символом и проверять, является ли символ пунктуацией. Если это так, то обрежьте строку на один символ раньше и добавьте оставшуюся часть (эффективно удаляя этот символ / пунктуацию).

Предпочитаю использовать StringBuilder или StringBuffer вместо прямого манипулирования строкой.

Используйте метод String.substring(), чтобы вырезать строку.

В противном случае используйте метод String.replace()/String.replaceAll(), чтобы заменить все знаки пунктуации (вам нужно будет экранировать определенные символы) на «».

Источник

Оцените статью