Regex и lookahead: Java

1

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

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

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

Теги:
punctuation
lookahead

2 ответа

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

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

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

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

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

s = s.replaceAll("(?![.])\\p{Punct}" , " ");      
  • 0
    Ты мне очень нравишься, радуга единорог аватарка.
3

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

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

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

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

Объяснение:

  • [^abc] соответствует любому символу, который не является a, b или c.
  • [^\P{Punct}] соответствует любому символу, который "не является символом пунктуации", эффективно сопоставимым с \p{Punct}.
  • [^\P{Punct}.] Поэтому соответствует любому символу, который является символом пунктуации, за исключением точки.
  • 0
    +1 за [^\\P{Punct}.] . Я забыл, что вы можете отрицать \p как это.

Ещё вопросы

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