我有以下几点:
[11] pry(main)> "ab BN123-4.56".scan(/BN([0-9_\.-]+)/)
=> [["123-4.56"]]
[12] pry(main)> "ab BN123-4.56".scan(/BN([0-9\.-_]+)/)
=> [["123"]]我不知道为什么第二个下划线在结尾处的行为与第一个不同。RegEx解析器如何对其进行解释以使其与众不同?
发布于 2014-04-28 12:21:12
这是因为您将连字符(-)放置在字符类的中间,而不被转义。
在字符类[]中,可以将连字符(-)放置为first或last字符。如果您将连字符放置在其他任何地方,则需要转义它(\-)以进行匹配。
"ab BN123-4.56".scan(/BN([0-9_\.-]+)/) # => '123-4.56'
"ab BN123-4.56".scan(/BN([0-9\.\-_]+)/) # => '123-4.56'注意事项:你也不需要转义点(.),所以你可以把它重写为..。
"ab BN123-4.56".scan(/BN([0-9_.-]+)/) # => '123-4.56'或者,如果您选择将其放在字符类的中间,甚至会出现以下情况。
"ab BN123-4.56".scan(/BN([0-9.\-_]+)/) # => '123-4.56'发布于 2014-04-28 12:21:46
连字符把事情搞砸了,而不是下划线。
-是字符类中的一个特殊字符,表示范围。逃避它的一种方法是将它放在类的开头或结尾:[...-]。
因此,[_.-]检查一个字符,_、.或-。
和[.-_]检查一个字符,范围为“从.到_”。
插图
BN([0-9.\-_]+)执行你所期望的并从ab BN123-4.56中选择123-4.56。
发布于 2014-04-28 12:22:17
方括号[]中的连字符表示范围。使用文字连字符转义它,就像使用
https://stackoverflow.com/questions/23340941
复制相似问题