【问题标题】:Purpose of this dash character in Regex capture正则表达式捕获中此破折号字符的用途
【发布时间】:2018-04-24 02:04:22
【问题描述】:

我试图了解此正则表达式捕获子句中- 的用途

(?P<slug>[\w-]+)

这是我在搜索破折号时想到的

破折号 (-) 可用于指定范围。所以破折号是 元字符,但仅限于字符类中。如果你想使用 字符类中的文字破折号,您应该使用 反斜杠,除非破折号是第一个或最后一个字符 字符类。所以,正则表达式 [a-z] 等于 [az-] 和 [-az], 它们将匹配这三个字符中的任何一个。

我的问题是 \w 之后的- 是什么

【问题讨论】:

  • “所以,正则表达式 [a-z] 等于 [az-] 和 [-az],它们将匹配这三个字符中的任何一个。” - 听起来不对。 [a-z] 将匹配 range 小写 a 到字符直到小写 z。而其他两个在功能上是等效的,它们只会匹配三个字符之一,za-。将鼠标悬停在regexr.com/3oe5o 上以进行澄清,并在 regexr.com 中使用正则表达式

标签: regex


【解决方案1】:

您正在查看我的前 CS 教授所说的兔子(脱帽):

(?P<slug>[\w-]+)

它是兔子的原因是因为通常你的研究是正确的,并且破折号被用作一系列字符的一部分。但在这种情况下,破折号是 literal 破折号,因为它出现在字符类的末尾。

所以这里[\w-]+ 表示匹配一个或多个单词字符文字破折号。

如果您想在字符类中包含文字破折号,更安全的方法是转义它:

[\w\-]+

然后,破折号可以放在类中的任何位置。

【讨论】:

  • 不正确:正则表达式引擎会首先尝试找到一个范围,如果失败,则会将破折号视为文字字符。。破折号 first 或 last 始终是文字;当处于这些位置时,它永远不会“尝试找到一个范围”。
  • @Bohemian 我使用这种语言的目的是为了表明使用未转义的破折号总是会导致其意图模棱两可。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-31
  • 2012-08-23
  • 1970-01-01
相关资源
最近更新 更多