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

本文关键字:获取 标点符号 字符串 | 更新日期: 2023-09-27 18:21:39

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

示例:

  • 测试!会回来的
  • 测试;;将返回
  • 测试?:?会回来吗?:?

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

我目前有一个相当笨拙的解决方案,但不知道是否有人能提出一个更简洁的方法。

我的穿孔清单是

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

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

您可以使用以下正则表达式:

'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);

使用正则表达式:

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}而不是[.:!?,;-]

为了"存储"标点符号,您可以拆分字符串:

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

splitArray[0]包含标点符号之前的部分,splitArray[1]包含标点符号字符。如果有的话。

使用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。