我对Why's Poignant Guide to Ruby中的以下正则表达式有 2 个问题:
1:这里的减号是什么意思?它似乎没有指定范围,因为除了括号之外,它的左侧没有任何内容。
2:为什么要转义右括号?转义开头的括号后,右括号有什么特殊含义?
/\([-\w]+\)/
我对Why's Poignant Guide to Ruby中的以下正则表达式有 2 个问题:
1:这里的减号是什么意思?它似乎没有指定范围,因为除了括号之外,它的左侧没有任何内容。
2:为什么要转义右括号?转义开头的括号后,右括号有什么特殊含义?
/\([-\w]+\)/
1)当减号在字符类的开头或结尾时,它被视为文字。
2)转义右括号是一种约定。目标是 IMO,以避免之前可能出现的左括号产生歧义。考虑这些例子:
/(\([-\w]+\))/ or /(\([-\w]+)\)/
1) 减号是文字减号。由于它不可能指定范围,因此它没有特殊含义,因此字符类相当于[\-\w]
- 转义连字符是可选的,正如您在第二点中观察到的那样......
2) ...然而,仅仅因为正则表达式引擎允许而不逃避某些东西并不总是好的形式。例如,这个正则表达式:([([^)-]+)
是完全有效的(我认为......)但完全不清楚,因为通常具有特殊含义的字符被用作文字字符而没有被转义。有效,是的,但并不明显,不了解所有规则的人在试图理解它时会变得非常困惑。
减号-
,或者说连字符,意味着正好是字符-
。连字符可以在左括号之后,右括号之前,或者在否定插入符号之后。它没有指定范围,因此不会造成混淆。\-
如果您愿意,也可以选择使用。
至于为什么要 escape )
,我认为这意味着减少正则表达式引擎的工作,这样它就不必记住前括号是否存在。
-
登录这个正则表达式实际上意味着-
您想在文本中看到的标志。
非转义括号表示一个匹配组,您可以使用它,例如,通过$1
变量。
> "(-w)" =~ /\([-\w]+\)/
> $1 # => nil
和
> "(-w)" =~ /([-\w]+)/
> $1 # => -w
您可以去Rubular并尝试这两个正则表达式\([-\w]+\)
和([-\w]+)
- 通过(-w)
作为测试通过,您会看到不同的结果。您可以注意到匹配组出现。