How to match hyphens with Regular Expression?
如何重写[a-zA-Z0-9!$* \t
]模式以匹配连字符和现有字符?
- 不添加空格,您可以添加s.s,也可以匹配其他类型的空格。
连字符通常是正则表达式中的普通字符。只有当它在一个字符类和两个其他字符之间时,它才具有特殊的含义。
因此:
- [-]与连字符匹配。
- [abc-]与a、b、c或连字符匹配。
- [-abc]与a、b、c或连字符匹配。
- [ab-d]与a、b、c或d匹配(此处连字符表示字符范围)。
- @你想让他既给你写又把它拼出来吗?您只需将连字符添加到组中。
- @我相信我已经给出了答案。问题是"如何写‘x’…",我相信我已经解释了如何做到这一点。拿着我的答案,把解释应用到手头的实际表达中,不需要比一年级学生更需要的认知技能。事实上,这正是一年级学生在学习基础算术时所学的。请随意纠正我的假设。
- 如果连字符不能形成一个范围,它就从字符类内部直接提取。
- 注意:如果对hyphenx2d使用十六进制代码,它仍然会看到它表示字符范围。(仅在javascript中测试)是否有其他人找到这个?
- @markp well,duh:字符十六进制代码由前端解析器(C,或javascript,或您使用的任何语言)转换为实际字符。因此,对于字符串的值而言,使用十六进制代码与使用实际字符是相同的。
- @冰球不,不需要支架。然而,正如答案所述,破折号必须是最后一个。特别是,圆括号并没有达到您期望的效果;您需要删除它们(以及空格!).
- @当然,愚蠢的错误。关于[a-c-e]中的解释:这在某些regex规范/引擎中是无效的。例如,posix regex不允许这样做。
去掉连字符。
更新:别介意这个答案-你可以将连字符添加到组中,但是你不必逃避它。请看康拉德·鲁道夫的回答,它在回答问题上做得更好,并解释了原因。
- 完全不必要。
- 哦,是吗?这是因为它在角色组中吗?我的错。
- @Konradrudolph你是对的,但我不确定未捕获的版本更容易理解。破折号的两种可能用法令人困惑,这就是为什么要从这个问题开始。一旦你了解了它,它肯定会更优雅,但对于初学者来说,它有点令人困惑。
总是使用转义连字符比较容易混淆,这样就不必依赖于位置。这是括号字符类中的一个\-。
但是还有其他的事情要考虑。有些枚举字符的编写方式可能有所不同。在某些情况下,他们肯定应该这样做。
比较一下雷吉克斯的口味就可以看出C?可以使用一些更简单的Unicode属性。如果您处理的是Unicode,那么可能应该对所有可能的字母使用通用类别\p{L},对十进制数字使用\p{Nd}。此外,如果您想适应所有的破折号标点,而不仅仅是连字符-减号,您应该使用\p{Pd}属性。您可能还希望将空白字符序列简单地写为\s,假设这对您来说不太一般。
总而言之,这是为了让[\p{L}\p{Nd}\p{Pd}!$*]的apattern与该集合中的任何一个字符相匹配。
不管怎样,我可能会使用它,即使我没有计划处理完整的Unicode集,因为这是一个很好的习惯,而且因为这些东西经常超出它们的原始参数。现在,当您将其提升到其他代码中使用时,它仍然可以正常工作。如果你硬编码所有的字符,它不会。
- 我倾向于同意这个答案,你越不需要知道代码就越安全。这让我想起了操作程序的优先级问题:stackoverflow.com/questions/10007140/…,我更喜欢在它们中插入括号(由我的IDE自动添加),不需要知道所有这些问题。你或其他人迟早会搞砸的。当然,如果您在项目中与regex一起工作很多,您可能需要拥有更高级的知识。
[-A-Z0-9]+、[A-Z0-9-]+、[A-Z-0-9]+和[A-Z-0-9]+都是相同的。两个范围之间的连字符被视为一个符号。而且[A-Z0-9-+()]+这个regex允许连字符。
这就是你想要的吗?
1
| MatchCollection matches = Regex.Matches(mystring,"-"); |
使用不带引号的"p pd"来匹配任何类型的连字符。"-"字符只是一种连字符,它在regex中也恰好是一种特殊字符。