仅从字符串末尾获取标点符号

时间:2012-01-27 10:05:39

标签: c#

我正在寻找一个C#代码段来删除和存储来自字符串末尾的任何标点符号

示例:

  • 测试!会回来!
  • 测试;;会回来;;
  • 测试?:?会回来吗?:?

  • !!测试!?!会回来的!?!

目前我有一个相当笨重的解决方案,但想知道是否有人可以提出更简洁的方法来做到这一点。

我的puncutation列表是

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

3 个答案:

答案 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。