仅从字符串末尾获取标点符号
本文关键字:获取 标点符号 字符串 | 更新日期: 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。