我正在寻找一个C#代码段来删除和存储来自字符串末尾的任何标点符号。
示例:
测试?:?会回来吗?:?
!!测试!?!会回来的!?!
目前我有一个相当笨重的解决方案,但想知道是否有人可以提出更简洁的方法来做到这一点。
我的puncutation列表是
new char[] { '.', ':', '-', '!', '?', ',', ';' })
答案 0 :(得分: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);
答案 1 :(得分: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
正如Oded建议的那样,如果您要删除所有标点符号,请使用\p{P}
而不是[.:!?,;-]
,而不仅仅是列表中的标点字符。
要同时“存储”标点符号,您可以拆分字符串:
splitArray = Regex.Split(subjectString, @"(?=\p{P}+$)");
然后splitArray[0]
包含标点符号前的部分,splitArray[1]
标点字符。如果有的话。
答案 2 :(得分: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的Contains。