如何用正则表达式匹配连字符?
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-]
匹配 a
、b
、c
或连字符。
[-abc]
匹配 a
、b
、c
或连字符。
[ab-d]
匹配 a
、b
、c
或 d
(仅在此处连字符表示字符范围)。
【讨论】:
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”来匹配任何类型的连字符。 '-' 字符只是连字符的一种,它也恰好是正则表达式中的特殊字符。
【讨论】:
以上是关于如何用正则表达式匹配连字符?的主要内容,如果未能解决你的问题,请参考以下文章