如何只允许字符串中的第一个标点符号在单词之间具有不同的标记序列

时间:2016-10-24 05:14:38

标签: c# regex string text punctuation

如果我只需要在字符串中只允许第一个标点符号,并且在单词之间使用不同的标点符号序列,例如,如果字符串为:

string str = "hello,.,.,.world.,.?,.";

结果我想得到这个:

hello, world.

最好知道两者,插入后如何传递这样的字符串以及如何避免在文本框中直接在字符串中的单词之间写入多于一个标记和一个空格。

2 个答案:

答案 0 :(得分:0)

您可以尝试:(?<=[,.])[,.?]+

在此处查看:https://regex101.com/r/di5Ebw/1

如果您需要删除要删除的特殊情况列表,我们可以在[,.]进行调整!

(所以在示例中,我给你的匹配是你要删除的字符:只需用空字符串替换匹配 - 正如你在底部的SUBSTITUTION面板中看到的那样)

[编辑] 扩展匹配案例。

如果您不想打扰,请执行此操作:(?<=\W)(?<! )\W+

在此处查看:https://regex101.com/r/di5Ebw/2

答案 1 :(得分:0)

.Net正则表达式有一个标点符号类,因此获得所需结果的一种简单方法是搜索字符串(\w\p{P})\p{P}+并替换为$1

对于处理问题中使用的几个标点字符的正则表达式,可以使用正则表达式(\w[.,?])[.,?]+

(注意,上面显示了正则表达式。他们的C#字符串是"(\\w\\p{P})\\p{P}+""(\\w[.,?])[.,?]+"。)

解释。这会查找单词字符(\w),后跟一个标点符号,并捕获这两个字符。紧随其后的标点符号由\p{P}+匹配。整个匹配被捕获取代。

\p{name}构造为defined here as &#34;匹配Unicode常规类别中的任何单个字符或name指定的命名块。 &#34;

\p{P}类别defined here&#34;所有标点字符&#34; 。标点符号也有几个子类别,但最好是Unicode来理解它们。