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

Tho*_*son 67 c# regex

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

Kon*_*lph 158

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

从而:

  • [-] 匹配连字符.
  • [abc-]比赛a,b,c或连字符.
  • [-abc]比赛a,b,c或连字符.
  • [ab-d]匹配a,b,cd(这里只连字符表示一个字符范围).

  • @rrrr:我相信我已经给出了答案.问题是"如何写'X'......"我相信我已经解释了如何做到这一点.把我的答案和解释应用到手头的实际表达应该不需要比一年级学生更多的认知技能.事实上,这正是一年级学生在教授基本算术时学会做的事情.随意纠正我的假设. (9认同)
  • @MarkP嗯,duh:字符十六进制代码由前端解析器*(C#,或者你正在使用的任何语言)转换为实际字符.因此,就字符串的值而言,使用十六进制代码与使用实际字符相同. (2认同)
  • @Pshemo 当然,愚蠢的错误。关于“[ace]”中的解释:这在某些正则表达式规范/引擎中是无效的。例如,POSIX 正则表达式不允许这样做。 (2认同)

Nei*_*ell 64

逃脱连字符.

[a-zA-Z0-9!$* \t\r\n\-]
Run Code Online (Sandbox Code Playgroud)

更新:
没关系这个答案 - 您可以将连字符添加到组中,但您不必逃避它.请参阅Konrad Rudolph的答案,它可以更好地回答并解释原因.

  • @KonradRudolph你是对的,但我不确定未转义的版本是否更容易理解.破折号的两种可能用法令人困惑,这就是为什么一开始就有这方面的问题.一旦你了解它肯定会更优雅,但对于初学者来说它有点令人困惑. (11认同)

tch*_*ist 12

总是使用转义连字符不那么令人困惑,因此它不必依赖于位置.这是一个\-括号内的角色类.

但还有其他需要考虑的事情.其中一些枚举字符应该以不同的方式编写.在某些情况下,他们肯定应该.

这种正则表达式的比较说C♯可以使用一些更简单的Unicode属性.如果您正在处理Unicode,则应该使用\p{L}所有可能字母的常规类别,也可以 \p{Nd}使用十进制数字.此外,如果你想要容纳所有短划线标点符号,而不仅仅是HYPHEN-MINUS,你应该使用该\p{Pd}属性.你可能也想把这个空格字符序列简单地写成\s,假设对你来说不太通用.

总之,这可以解决[\p{L}\p{Nd}\p{Pd}!$*]与该集合中的任何一个角色相匹配的问题.

无论如何,即使我没有计划处理完整的Unicode集,我也可能会使用它,因为这是一个很好的习惯,因为这些东西经常超出原始参数.现在当你解除它以在其他代码中使用时,它仍然可以正常工作.如果您对所有字符进行硬编码,则不会.


Rad*_*scu 5

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


小智 5

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