как использовать java-сканер и регулярные выражения для удаления знаков препинания во входном тексте, но не "т.е." - PullRequest
0 голосов
/ 28 июня 2011

Как мне прочитать это предложение и разобрать его с помощью сканера, чтобы получить вывод ниже?

Ввод: "он красный, т.е. красный. Не читается."

Вывод: он красный, т.е. КРАСНЫЙ не читается

Я попробовал следующее, но он не удаляет точки в конце слов:

Scanner lineReader = new Scanner(scanner.nextLine());
lineReader.useDelimiter(("\\s+(\\W*\\s)?"));

edit: позвольте мне изменить это требование:Как удалить все знаки препинания из входного текста, но не в том случае, если его точка (.) между двумя буквами, например,

1 Ответ

1 голос
/ 28 июня 2011

"(?<!i\\.e)\\.? |\\.$" должен сделать трюк.

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

  • пробел
  • точка и пробел (если точке не предшествует "i.e")
  • точка и конец строки.

Что касается вашего редактирования, попробуйте "((?<=\\s\\w{1,10})[^\\w\\s])?\\s|[^\\w\\s]$"

[^\\w\\s] означает любой символ, который не является буквой, цифрой или пробелом (то есть пунктуацией).

(?<=\\s\\w{1,10})[^\\w\\s])?\\s означает пробел, которому может предшествовать пунктуация, если перед следующим предыдущим пробелом нет других знаков препинания. То есть он не будет совпадать с .[space] в e.g.[space], потому что между e и g существует полная остановка. Задняя часть ((?<=\\s\\w{1,10})) должна иметь максимальную длину и поэтому не может использовать операторы «ноль или более» или «один или более» (* и +). Я поставил произвольный предел в 10, потому что я не знаю ни одного слова или аббревиатуры, которые бы содержали знаки препинания и состояли из нескольких символов.

edit: я протестировал новое регулярное выражение на it is red i.e. RED. not read. e.g. 1,2, done!, и он выдал:

  • он
  • есть
  • красный
  • RED
  • не
  • прочитать
  • сделано
...