2012-01-27 3 views
2

Я ищу фрагмент C# для удаления и сохранения любых знаков препинания от конец строки только.Получение пунктуации только от конца строки

Пример:

  • Test! вернется!
  • Испытание ;; вернется ;;
  • Тест?:? вернется?:?

  • !! Test!?! вернется!?!

В настоящее время у меня довольно неуклюжее решение, но задаюсь вопросом, может ли кто-нибудь предложить более сжатый способ сделать это.

Мой список puncutation является

new char[] { '.', ':', '-', '!', '?', ',', ';' }) 

ответ

2

Использование Linq:

var punctuationMap = new HashSet<char>(new char[] { '.', ':', '-', '!', '?', ',', ';' }); 
var endPunctuationChars = aString.Reverse(). 
            TakeWhile(ch => punctuationMap.Contains(ch)); 
var result = new string(endPunctuationChars.Reverse().ToArray()); 

HashSet не является обязательным , вы можете напрямую использовать Контексты Linq в массиве.

+0

@ Ник, оттуда вы можете сделать: string restOfTheWord = aString.SubString (0, aString.Length - result.Length); –

5

Использование регулярных выражений:

resultString = Regex.Replace(subjectString, @"[.:!?,;-]+$", ""); 

Объяснение:

[.:!?,;-] # Match a character that's one of the enclosed characters 
+   # Do this once or more (as many times as possible) 
$   # Assert position at the end of the string 

Как предположил Одед, использовать \p{P} вместо [.:!?,;-] если вы хотите удалить все punctuati на символы, а не только те из вашего списка.

также «магазин» пунктуацию, можно разделить строку:

splitArray = Regex.Split(subjectString, @"(?=\p{P}+$)"); 

Затем splitArray[0] содержит часть перед пунктуацией и splitArray[1] знаков пунктуации. Если они есть.

+0

Будет ли это применяться только к концу буквенно-цифровой строки, а не к специальным символам до или в ней. – Nick

+0

@ Ник: Да.Надеюсь, объяснение, которое я только что добавил, делает это ясным. –

+0

Он сделал - спасибо за объяснение. Как легко получить остальную часть слова? – Nick

7

Вы можете использовать следующее регулярное выражение:

\p{P}*$ 

Это ломает вниз:

\p{P} - Unicode punctuation 
*  - Any number of times 
$  - End of line anchor 

Если вы знаете, что всегда будут какие-то знаки препинания в конце строки, использование + для эффективность.

И использовать его как это для того, чтобы получить знаки препинания:

string punctuation = Regex.Match(myString, @"\p{P}*$").Value; 

Чтобы реально удалить его:

string noPunctuation = Regex.Replace(myString, @"\p{P}*$", string.Empty); 
+0

+1 для Unicode. Но лучше использовать '+' или много ненужных «ничего заменить ничего», операции будут выполняться на строках, которые не заканчиваются пунктуацией. –

+0

Это фактически * соответствует * последним пунктуациям, но не * удаляет их. – Tigran

+0

@ Тигран - правда. Я работал с его примерами (где он хочет, чтобы пунктуация была отменена). – Oded