gsub在ruby中如何使用输入中的元字符

gsub在ruby中如何使用输入中的元字符,ruby,Ruby,我需要帮助来理解下面的工作原理 "middl'-.*$%ddlemiddlemiddlemiddlemiddlemiddlemiExcess".gsub(/[^a-zA-Z'-.]/, '') # => "middl'-.*ddlemiddlemiddlemiddlemiddlemiddlemiExcess" "middl'-.*$%ddlemiddlemiddlemiddlemiddlemiddlemiExcess".gsub(/[^a-zA-Z.'-]/, '') # => "

我需要帮助来理解下面的工作原理

"middl'-.*$%ddlemiddlemiddlemiddlemiddlemiddlemiExcess".gsub(/[^a-zA-Z'-.]/, '')
# => "middl'-.*ddlemiddlemiddlemiddlemiddlemiddlemiExcess"

"middl'-.*$%ddlemiddlemiddlemiddlemiddlemiddlemiExcess".gsub(/[^a-zA-Z.'-]/, '')
# => "middl'-.ddlemiddlemiddlemiddlemiddlemiddlemiExcess"
当我给出
/[^a-zA-Z'-.]/
时,星号不会被移除,但在第二个示例中,星号被移除。为什么?


我希望
gsub
之后的结果只存在字母(
a-zA-Z
)、句点(
)、hypen(
-
)、单撇号(
')
)。仅通过更改正则表达式中的句点位置,输出就不同了。

/[^a-zA-Z'-.]/
中,连字符被视为范围分隔符,与前面的
a-Z
完全相同。范围是:

▶ ("'"..'.').to_a
#⇒ ["'", "(", ")", "*", "+", ",", "-", "."] # note asterisk
/[^a-zA-Z.-]/
中,连字符是最后一个符号,因此它本身被视为连字符。

这可能会帮助您: