Регулярное выражение и просмотр вперед: java

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

public static String removePunctuation(String s){       
s = s.replaceAll("(?!.)\\p{Punct}" , " ");      
return s;
}

Я обнаружил, что мы можем использовать «отрицательный просмотр вперед» для такого рода проблем, но когда я запускаю этот код, он ничего не стирает. Отрицательный просмотр вперед отменил регулярное выражение \p{Punct}.


person user3691943    schedule 30.05.2014    source источник


Ответы (2)


Символ . имеет особое значение в регулярных выражениях. По сути, это означает «любой символ, кроме новых строк» ​​(если не указан флаг DOTALL, в этом случае он означает «любой символ»), поэтому ваш шаблон будет соответствовать «любому знаку препинания, который является символом новой строки». Другими словами, он никогда не соответствует что-либо.

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

s = s.replaceAll("(?!\\.)\\p{Punct}" , " ");      

Или оберните его в класс символов, например:

s = s.replaceAll("(?![.])\\p{Punct}" , " ");      
person p.s.w.g    schedule 30.05.2014

Неэкранированная точка соответствует всему (кроме новой строки). Вам нужно как минимум

s = s.replaceAll("(?!\\.)\\p{Punct}" , " "); 

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

s = s.replaceAll("[^\\P{Punct}.]" , " ");  

Пояснение:

  • [^abc] соответствует любому символу, кроме a, b или c.
  • [^\P{Punct}] соответствует любому символу, который не является знаком пунктуации, т. е. фактически совпадает с \p{Punct}.
  • Таким образом, [^\P{Punct}.] соответствует любому символу пунктуации, кроме точки.
person Tim Pietzcker    schedule 30.05.2014
comment
+1 за [^\\P{Punct}.]. Я забыл, что вы можете вот так отрицать \p. - person p.s.w.g; 30.05.2014