0

我对Why's Poignant Guide to Ruby中的以下正则表达式有 2 个问题:

1:这里的减号是什么意思?它似乎没有指定范围,因为除了括号之外,它的左侧没有任何内容。

2:为什么要转义右括号?转义开头的括号后,右括号有什么特殊含义?

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

4 回答 4

5

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

2)转义右括号是一种约定。目标是 IMO,以避免之前可能出现的左括号产生歧义。考虑这些例子:

/(\([-\w]+\))/    or     /(\([-\w]+)\)/ 
于 2013-08-07T15:02:39.520 回答
3

1) 减号是文字减号。由于它不可能指定范围,因此它没有特殊含义,因此字符类相当于[\-\w]- 转义连字符是可选的,正如您在第二点中观察到的那样......

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

于 2013-08-07T15:02:40.363 回答
1

减号-,或者说连字符,意味着正好是字符-。连字符可以在左括号之后,右括号之前,或者在否定插入符号之后。它没有指定范围,因此不会造成混淆。\-如果您愿意,也可以选择使用。

至于为什么要 escape ),我认为这意味着减少正则表达式引擎的工作,这样它就不必记住前括号是否存在。

于 2013-08-07T15:04:05.620 回答
1

-登录这个正则表达式实际上意味着-您想在文本中看到的标志。

非转义括号表示一个匹配组,您可以使用它,例如,通过$1变量。

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

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

您可以去Rubular并尝试这两个正则表达式\([-\w]+\)([-\w]+)- 通过(-w)作为测试通过,您会看到不同的结果。您可以注意到匹配组出现。

于 2013-08-07T15:04:43.730 回答