正则表达式(regexps)是展示一个字符串内容的代码。 它们通常用于测试一个字符串的模式,并确定字符串的哪些部分与所需的输出相匹配。
- 语法:Regexp.=~()
- 参数:Regexp值
- 返回:true - 如果两个表达式与字符串匹配,如果没有匹配,那么将返回False。
它们通常用/pat/和%r{pat}字面意义或Regexp.new 构造函数来构建。
一个regexp通常被限制在正斜线(/)内。 例如,如果一个字符串具有我们所需要的模式,那么它就可以被称为 "重构"。
/par/ =~ 'parrot' #=> 0
/p/.match('parrot') #=> #<MatchData "p">
如果一个字符串具有我们正在寻找的模式,那么它就被称为匹配。
这里,"鹦鹉 "这个词没有 "喙 "这个模式,所以它不匹配。
/beak/.match('parrot') #=> nil
这里,'parrot'包含模式'par',所以它匹配。
/par/.match('parrot') #=> #<MatchData "par">
请记住,任何Regexp匹配将显示一个RuntimeError,当设置和超过一个超时。 这就是为什么,很多时候,这些代码可能会被恶意的用户利用来进行DoS或ReDoS。
因此,为了防止或减轻DoS的风险,Ruby引入了Regexp.timeout 。
超时
有两个API来设置超时。它们是。
- Timeout.timeout=它是Regexp匹配的进程全局配置超时。
- Regexp.new.=的超时关键字,当我们想为一些特殊的Regexps尝试不同的超时设置时使用。
Timeout.timeout
Regexp.timeout = 4
q = 'a' * 25 + 'd' + 'a' * 4 + 's' #=> "aaaaaaaaaaaaaaaaaaaaaaaaadaaaas"
/(b|a+)*s/ =~ q #=> Regexp::TimeoutError is raised in four seconds
Regexp.new的超时关键字
re = Regexp.new("(b|a+)*c", timeout: 4)
q = 'a' * 25 + 'd' + 'a' * 4 + 's' #=> "aaaaaaaaaaaaaaaaaaaaaaaaadaaaas"
/(b|a+)*s/ =~ q #=> Regexp::TimeoutError is raised in four seconds
当我们使用Regexp来运行一个不受信任的输出时,理解并使用超时功能来防止多次回溯是很重要的。
如果不这样做,代码将容易受到拒绝服务攻击,因为攻击者可能会利用它,提供一个输入到Regexp ,因为代码可能在其他方面匹配一个不合适的Regexp 。
我们不要忘记,超时不是默认设置的,因为适当的限制通常是由应用程序的需求和内容决定的。