如何在Ruby正则表达式中正确使用lookahead?

如何在Ruby正则表达式中正确使用lookahead?,ruby,regex,Ruby,Regex,我希望它只匹配您可能想要使用的[“的第一个实例,而不是String#scan,它迭代地应用模式,直到到达字符串末尾 > "<style type=\"text/html\">ciaoxocs <style />".match(/<style\s?(?!\/>)/).to_a => ["<style "] >“ciaoxocs”。将(/)/)匹配到 =>[“请注意,第二个匹配(来自)正好在子字符串匹配之后出现。问题来自回溯机制。让我们看看关闭

我希望它只匹配您可能想要使用的
[“的第一个实例,而不是
String#scan
,它迭代地应用模式,直到到达字符串末尾

> "<style type=\"text/html\">ciaoxocs <style />".match(/<style\s?(?!\/>)/).to_a
=> ["<style "]
>“ciaoxocs”。将(/)/)匹配到

=>[“请注意,第二个匹配(来自
)正好在子字符串匹配之后出现
。问题来自回溯机制。让我们看看关闭标记发生了什么情况的描述:

失败。在这种情况下,回溯机制开始,量词逐个返回其字符,直到模式成功。在我们的例子中,唯一的可能性是从
\s?
返回空格
在这个回溯步骤之后,
条件成功,并且
“/>”

有几种可能防止这种机制:

  • 使用原子组
    (?>…)
    (一旦到达右括号,就禁止子模式回溯):
    \s?(!/>)
  • 使用所有格量词
    ?+
    (禁止对量词进行回溯):
  • 在前瞻中包含空格:
    )\s?

RUBY正则表达式有一个问题:这不是我要问的。你的问题是可选空间。如果你想让空间成为可选空间,你还必须将它添加到前瞻中。@MikeK.,不,
/)/
我只是想知道你所做的是否更容易实现。这不是我要问的。真的吗?它完全符合你的要求估计。如果您确实希望得到不同的结果,请准确输入原始字符串的哪一部分应该匹配。@joanbm OP不是询问结果。OP是询问OP的代码发生了什么,以及只匹配第一个代码的更好方法(使用
扫描
)。从regex101.com中的“OP”中,它与其他LANG一样工作:“。他将苹果(单个regexp匹配)与橙子(重复regexp匹配)进行比较,这就是为什么会得到不同的结果。我发现正确的答案提到了这一误解,
#scan
真正的原因。我为什么要讨厌这一点?无论如何,好的答案,我已经理解了我遗漏了什么
<style /> or <style/>
> "<style type=\"text/html\">ciaoxocs <style />".match(/<style\s?(?!\/>)/).to_a
=> ["<style "]
"<style type=\"text/html\">ciaoxocs <style />".scan /<style\s(?!\/>)/
# => ["<style "]
"<style type=\"text/html\">ciaoxocs <style />".scan /<style(?!\s?\/>)/
# => ["<style"]