如何用正则表达式匹配连字符?

Posted

技术标签:

【中文标题】如何用正则表达式匹配连字符?【英文标题】:How to match hyphens with Regular Expression? 【发布时间】:2011-05-03 09:20:16 【问题描述】:

如何重写[a-zA-Z0-9!$* \t\r\n] 模式以匹配连字符和现有字符?

【问题讨论】:

可以添加\s,而不是添加空格和\t。 \s 也匹配其他类型的空格 【参考方案1】:

连字符通常是正则表达式中的普通字符。仅当它在一个字符类中并且在其他两个字符之间时,它才具有特殊含义。

因此:

[-] 匹配连字符。 [abc-] 匹配 abc 或连字符。 [-abc] 匹配 abc 或连字符。 [ab-d] 匹配 abcd仅在此处连字符表示字符范围)。

【讨论】:

Hyphen is taken literally from inside a character class, if it cannot form a range. 注意:如果您对连字符 \x2D 使用十六进制代码,它仍会将其视为表示字符范围。 (仅在 javascript 中测试)有其他人发现这个吗? @MarkP 嗯,废话:字符十六进制代码被由前端解析器(C#、JavaScript 或任何你使用的语言)转换成实际的特点。因此,就字符串的值而言,使用十六进制代码与使用实际字符相同。 @Puck 不,不需要括号。但是,正如答案所述,破折号必须是最后一个。特别是,括号不符合您的期望。您需要删除它们(以及空间!)。 @Pshemo 当然,愚蠢的错误。关于[a-c-e] 中的解释:这在某些正则表达式规范/引擎中根本无效。例如,POSIX 正则表达式不允许它。【参考方案2】:

转义连字符。

[a-zA-Z0-9!$* \t\r\n\-]

更新: 不要介意这个答案 - 您可以将连字符添加到组中,但您不必转义它。请参阅Konrad Rudolph's answer,而不是在回答和解释原因方面做得更好。

【讨论】:

哦是吗?那是因为它在一个角色组中吗?我的错。 @KonradRudolph 你是对的,但我不确定未转义的版本是否更容易理解。破折号的两种可能用法令人困惑,这就是为什么一开始就有关于这个的问题。知道了肯定会更加优雅,但是对于初学者来说就有点迷惑了。【参考方案3】:

总是使用转义的连字符更容易混淆,因此它不必依赖于位置。那是括号字符类中的\-

但还有其他需要考虑的事情。其中一些枚举字符可能应该以不同的方式书写。在某些情况下,他们绝对应该这样做。

comparison 的正则表达式风格说 C♯ 可以使用一些更简单的 Unicode 属性。如果您正在处理 Unicode,您可能应该使用通用类别 \pL 来表示所有可能的字母,也许 \pNd 来表示十进制数字。此外,如果您想容纳所有破折号标点符号,而不仅仅是连字符减号,您应该使用\pPd 属性。您可能还想将该空白字符序列简单地写为\s,假设这对您来说不是太笼统。

总而言之,[\pL\pNd\pPd!$*] 的模式可以匹配该集合中的任何一个字符。

我可能会使用它,即使我不打算处理完整的 Unicode 集,因为这是一个好习惯,而且因为这些东西经常超出它们的原始参数。现在,当您将其提升以在其他代码中使用时,它仍然可以正常工作。如果您硬编码所有字符,则不会。

【讨论】:

我倾向于同意这个答案,你需要知道的越少,代码就越安全。这让我想起了操作员优先级的问题:***.com/questions/10007140/…,我更喜欢在其中包含括号(由我的 IDE 自动添加),无需全部了解。你或其他人迟早会搞砸。当然,如果您在项目中经常使用正则表达式,您可能需要具备更高级的知识。【参考方案4】:

[-a-z0-9]+,[a-z0-9-]+,[az-0-9]+ 和 [az-0-9]+ 都是一样的。两个范围之间的连字符被视为一个符号。而且 [a-z0-9-+()]+ 这个正则表达式允许连字符。

【讨论】:

应该是最好的答案之一。【参考方案5】:

这就是你所追求的吗?

MatchCollection matches = Regex.Matches(mystring, "-");

【讨论】:

【参考方案6】:

使用不带引号的“\pPd”来匹配任何类型的连字符。 '-' 字符只是连字符的一种,它也恰好是正则表达式中的特殊字符。

【讨论】:

以上是关于如何用正则表达式匹配连字符?的主要内容,如果未能解决你的问题,请参考以下文章

如何用js匹配url的正则表达式

JS如何用正则表达式 获取字符串内的匹配部份?

如何用正则表达式匹配括号中的内容。

如何用正则表达式匹配括号中的内容,不包含括号

如何用正则表达式匹配IP地址

如何用正则表达式匹配汉字