irb 上 Ruby returns `nil` 中的前瞻性正则表达式

Lookahead regex in Ruby returns `nil` on irb

我有输入:

s = "<tag1 value = \"HelloWorld\" val = \"1234\">"

我想获取 'HelloWorld''1234'

我正在使用这个正则表达式

(?<=\")+[a-zA-Z0-9]*+(?=\)

On rubular,它给出了预期的结果,但是在 irb 上,它 returns nil:

s.scan(/(?<=\")+[a-zA-Z0-9]*+(?=\)/) # => []

为什么会发生这种情况,谁能解释一下?我缺少什么

我稍微更改了正则表达式,改为环绕最后一个 \"。我怀疑这与 \ 作为 Ruby 转义字符有关。

> "<tag1 value = \"HelloWorld\" val = \"1234\">".scan(/(?<=\")+[a-zA-Z0-9]*+(?=\")/)
#=> ["HelloWorld", "1234"]
s = "<tag1 value = \"HelloWorld\" val = \"1234\">"

字符串值为:

<tag1 value = "HelloWorld" val = "1234">

执行e即可轻松查看。 G。 puts s。您会在那里看到反斜杠,因为 ruby 中的字符串可能使用双引号声明,在这种情况下,字符串中的双引号将使用反斜杠进行转义。在 ruby 中声明相同字符串的其他方法是:

s = '<tag1 value = "HelloWorld" val = "1234">'
s = %|<tag1 value = "HelloWorld" val = "1234">|
s = <<STR
<tag1 value = "HelloWorld" val = "1234">
STR

两者都不需要转义双引号。如果您将 IRB 中显示的字符串复制为 rubular,并带有转义反斜杠,则您匹配了另一个字符串。

也就是说,由于原始字符串中没有反斜杠,因此 ruby 中没有任何匹配项。您使用的正则表达式还有其他问题。

这是正则表达式最仔细的版本:

s.scan /(?<=")\w+(?=")/
#⇒ ["HelloWorld", "1234"]