Как разрешить только первый знак препинания в строке с разной последовательностью знаков между словами

#c# #regex #string #text #punctuation

#c# #регулярное выражение #строка #текст #пунктуация

Вопрос:

Если мне нужно разрешить только первый знак препинания в строке с разной последовательностью знаков препинания между словами, например, если строка:

 string str = "hello,.,.,.world.,.?,.";
  

в результате я хочу получить это:

 hello, world.
  

Было бы хорошо знать, как передавать такую строку после вставки и как избежать написания более одного знака и одного пробела между словами в строке непосредственно в текстовом поле.

Ответ №1:

Вы можете попробовать это: (?<=[,.])[,.?] .

Посмотрите, как это работает здесь: https://regex101.com/r/di5Ebw/1 .

Если вам нужно иметь список специальных символов, которые вы хотите удалить, мы можем настроить [,.] !

(Итак, в примере, который я привожу вам, совпадение относится к символам, которые вы хотите удалить: просто замените это совпадение пустой строкой — как вы можете видеть на панели ЗАМЕНЫ внизу)


[РЕДАКТИРОВАТЬ] Расширьте случаи совпадения.

Если вы не хотите беспокоиться, пусть это сделает это за вас: (?<=W)(?<! )W

Посмотрите, как это работает здесь: https://regex101.com/r/di5Ebw/2

Комментарии:

1. да, точно, если я хочу разобраться с пунктуацией, разделенной пробелом между словами, этот способ полезен

Ответ №2:

Регулярные выражения .Net имеют класс пунктуации, поэтому простым способом достижения требуемого результата является поиск строки (wp{P})p{P} и замена на $1 .

Для регулярного выражения, которое обрабатывает ровно несколько символов препинания, используемых в вопросе, можно использовать регулярное выражение (w[.,?])[.,?] .

(Обратите внимание, выше показаны регулярные выражения. Их строками C # являются "(\w\p{P})\p{P} " и "(\w[.,?])[.,?] " .)

Объяснение. Это ищет символ слова ( w ), за которым следует один знак препинания, и фиксирует эти два символа. Любые непосредственно следующие символы препинания сопоставляются p{P} . Все совпадение заменяется захватом.

p{name} Конструкция определяется здесь как «Соответствует любому отдельному символу в общей категории Unicode или именованному блоку, указанному по имени «..

p{P} Категория определяется здесь как «Все знаки препинания». Существует также несколько подкатегорий знаков препинания, но, возможно, лучше всего взглянуть на Unicode, чтобы понять их.

Комментарии:

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