Ruby 出现的减号不指定范围并转义右括号

Ruby 出现的减号不指定范围并转义右括号,ruby,regex,Ruby,Regex,关于以下正则表达式,我有两个问题: 1:这里的负号是什么意思?它似乎没有指定一个范围,因为除了括号之外,它的左边没有其他内容 2:为什么必须转义右括号?在你跳出开头的括号后,结尾的括号会有什么特殊的意义 /\([-\w]+\)/ 1当减号位于字符类的开头或结尾时,它被视为文字 2转义右括号是一种惯例。目标是IMO,以避免之前可能出现的带有括号的歧义。考虑这些例子: /(\([-\w]+\))/ or /(\([-\w]+)\)/ 减号是一个字面上的减号。因为它不可能指定

关于以下正则表达式,我有两个问题:

1:这里的负号是什么意思?它似乎没有指定一个范围,因为除了括号之外,它的左边没有其他内容

2:为什么必须转义右括号?在你跳出开头的括号后,结尾的括号会有什么特殊的意义

   /\([-\w]+\)/

1当减号位于字符类的开头或结尾时,它被视为文字

2转义右括号是一种惯例。目标是IMO,以避免之前可能出现的带有括号的歧义。考虑这些例子:

/(\([-\w]+\))/    or     /(\([-\w]+)\)/ 

减号是一个字面上的减号。因为它不可能指定一个范围,所以它没有特殊的含义,因此字符类相当于[\-\w]-转义连字符是可选的,正如您在第二点中观察到的

2…然而,仅仅因为正则表达式引擎允许而不转义并不总是好的形式。例如,这个正则表达式:[[^-]+我认为是完全正确的……但完全不清楚,因为通常具有特殊含义的字符被用作字面字符而没有转义。有效,是的,但不明显,不知道所有规则的人在试图理解它时会变得非常困惑。

减号-,或者说连字符,仅表示字符-。连字符可以包含在开始括号之后,也可以包含在结束括号之前,也可以包含在否定插入符号之后。它不指定范围,因此不会混淆。如果愿意,也可以选择使用\

至于为什么要转义,我认为这意味着减少正则表达式引擎的工作量,这样它就不必记住前面是否有一个圆括号。

-sign在这个正则表达式中实际上意味着一个-sign,您希望在文本中看到它

非转义括号表示一个匹配组,该组可供您使用,例如$1变量

> "(-w)" =~ /\([-\w]+\)/
> $1 # => nil


您可以转到并尝试两个正则表达式\[-\w]+\和[-\w]+-,通过测试,您将看到不同的结果。您可以注意到出现了匹配组。

在ruby中,方括号必须在字符类中转义。这里有一个关于主题的精彩主题:
> "(-w)" =~ /([-\w]+)/
> $1 # => -w