C# 正则表达式:匹配除“”以外的任何标点字符。及_

C# 正则表达式:匹配除“”以外的任何标点字符。及_,c#,.net,regex,C#,.net,Regex,在C#正则表达式中,有没有一种简单的方法来匹配除句点和下划线以外的所有标点符号?希望不用列举每一个标点符号就能做到 您可以像这样使用否定字符类: [^0-9A-Za-z._\s] 这包括除列出的字符外的所有字符。您可能需要排除更多的字符(如控制字符),这取决于您的最终需求。这里有一些更简单的方法。非文字或空白(其中文字包括A-Za-z0-9和下划线) 到目前为止,答案并不完全符合标点符号。这应该起作用: (?![\._])\p{P} (说明:负前瞻以确保既不匹配也不匹配,然后匹配任何unic

在C#正则表达式中,有没有一种简单的方法来匹配除句点和下划线以外的所有标点符号?希望不用列举每一个标点符号就能做到

您可以像这样使用否定字符类:

[^0-9A-Za-z._\s]

这包括除列出的字符外的所有字符。您可能需要排除更多的字符(如控制字符),这取决于您的最终需求。

这里有一些更简单的方法。非文字或空白(其中文字包括A-Za-z0-9和下划线)


到目前为止,答案并不完全符合标点符号。这应该起作用:

(?![\._])\p{P}
(说明:负前瞻以确保既不匹配
也不匹配
,然后匹配任何unicode标点字符。)

使用正则表达式减法

[\p{P}-[._]]
这里是.NET正则表达式文档的链接(我不确定其他版本是否支持它)。。。

这里有一个C#示例


解释该模式是字符类减法。它从一个像[\p{p}]这样的标准字符类开始,然后添加一个像-[.\u]这样的减法字符类,它表示删除。还有!。减法放在标准类guts后面的[]内。

好的,在排除列表中添加空格。在有限的集合上可以使用,但有很多可打印字符(货币符号、数学符号、变音符号等)本次去匹配这一点。关于本次去匹配这一点。关于本次去匹配这一点。关于本次去匹配这一点,关于本次去匹配这一点,关于本次去匹配这一点,关于本次去匹配这一点,关于本次去匹配这一点,关于本次去匹配这一点,关于关于本次去匹配这一点,关于关于本次去匹配这一点,关于关于本次去匹配这一关于本次去关于本次去匹配这一。关于关于本次去关于本次去匹配这这一点。关于本次去问问问问问问问问问问问问问问问问问问问问问问问问问问问问问问问问问问问问问问问问问问问问问问问问问问问问问问问问问问问问问问问问问问问问问问问问问问问问问问问问问问问问问问问问问问问问问问问问问问问问问问在这种情况下,句号不需要转义吗?为什么句号不排除每个字符?事实并非如此——正如所描述的那样——我只是不理解其中的逻辑。如果你真的逃过了句号,这似乎也会起作用。例如,
Regex([^a-zA-Z0-9\\.])。替换(“a\u b:c-d.e 4\\5&6%c.7.”,“
返回
“a\u b\u c\u d.e\u 4\u 5\u 6\u c\u 7”。
Regex([^a-zA-Z0-9.])
最好还是有一个像样的RTFM链接?@Chris不需要在那里转义,因为在
括号内时,句号没有特殊意义。为了方便起见,大多数正则表达式解析器都允许您在不改变其含义的情况下转义它;我可以测试它的错误吗?或者.NET不认为它们是标点符号吗?如果你掉了-[.],那么P {p}也不匹配。所以.NET不认为它们是标点符号吗?我很惊讶,重音不被认为是标点符号。我想你需要定义一下标点符号的含义。您可以添加“symbol”字符类(\p{S})来拾取重音、克拉和波浪。我将编辑我的示例。它似乎与^、~或`不匹配;我能测试它的错误吗?或者.NET不认为它们是标点符号?@ SasHely这是口音,你永远不会用那些标点符号在英语中。非常感谢!我决定接受莱斯的答案,因为我发现正则表达式减法在概念上更容易理解;因此,我更有可能记住它;但是+1-谢谢你教我一些新东西!(但愿我能接受两个答案)@Smashery-尽管字符类减法更容易理解,但请准备好在正则表达式中看到这个非常常见的构造。消极前瞻被大量使用。而且它可能会得到比减法(我猜)更多的正则表达式版本的支持。
[\p{P}-[._]]
string pattern = @"[\p{P}\p{S}-[._]]"; // added \p{S} to get ^,~ and ` (among others)
string test = @"_""'a:;%^&*~`bc!@#.,?";
MatchCollection mx = Regex.Matches(test, pattern);
foreach (Match m in mx)
{
    Console.WriteLine("{0}: {1} {2}", m.Value, m.Index, m.Length);
}