当前位置: 首页 > 知识库问答 >
问题:

正视与匹配重置(\K)正则表达式功能

罗昊空
2023-03-14

我刚刚了解了Ruby regex中明显未记录的\K行为(感谢anubhava的回答)。此功能(可能命名为Keep?)也存在于PHP、Perl和Python正则表达式中。它在其他地方被描述为“将迄今为止匹配的内容从匹配中删除,以便返回”

"abc".match(/ab\Kc/)     # matches "c"

这种行为是否与下面使用的积极回头标记相同?

"abc".match(/(?<=ab)c/)  # matches "c"

如果没有,这两种表现出什么不同?

共有1个答案

云项禹
2023-03-14

更容易看出\K之间的区别(?

look是一个零宽度断言,不使用字符,从当前位置(向后)测试:

> "abcdefg".scan(/(?<=.)./)
=> ["b", "c", "d", "e", "f", "g"]

“keep”(保留)功能\K(不是锚定)定义了模式中的一个位置,在该位置,左侧模式到目前为止匹配的所有内容都将从匹配结果中删除。但是在使用\K之前匹配的所有字符,它们不会出现在结果中:

> "abcdefg".scan(/.\K./)
=> ["b", "d", "f"]

行为与不使用\K时相同:

> "abcdefg".scan(/../)
=> ["ab", "cd", "ef"]

除了从结果中删除\K前面的字符。

\K的一个有趣用法是模拟可变长度的后视,这在Ruby中是不允许的(PHP和Perl也是如此),或者避免创建唯一的捕获组。例如(?

> "abcdefg".match(/a.*\Kf./)
=> #<MatchData "fg">

另一种方法是编写/a.*(f.)/,但是\K避免了创建捕获组的需要。

请注意,\K特性也存在于python regex模块中,即使这个特性也允许可变长度的lookbehinds。

 类似资料:
  • 有没有人试图描述与正则表达式匹配的正则表达式? 由于重复的关键字,这个主题几乎不可能在网上找到。 它可能在实际应用程序中不可用,因为支持正则表达式的语言通常具有解析它们的方法,我们可以将其用于验证,以及一种在代码中分隔正则表达式的方法,可用于搜索目的。 但是我仍然想知道匹配所有正则表达式的正则表达式是什么样子的。应该可以写一个。

  • 我有一根线,比如: 如何匹配每行的最后一个?顺便说一句,这是我试图在Sublime的文本中做到的。这些值不一致,就像我在这里看到的,我有几百行要替换。 我尝试了,但这与相匹配。

  • 问题内容: 我试图创建下面的正则表达式:返回之间的字符串和(或或)从下列字符串RNA: ,让所有的比赛会被发现,包括重叠的。 我尝试了几种正则表达式,最后得到了类似的结果: 您能告诉我我的正则表达式模式中的错误吗? 问题答案: 用一个正则表达式执行此操作实际上是非常困难的,因为大多数用法 都不 希望重叠匹配。但是,您可以通过一些简单的迭代来做到这一点: 虽然,这有一些问题。您希望得到的回报是什么?

  • 我们得到了一些这样的内容:

  • 问题内容: 我没有JavaScript方面的丰富经验,但是我正在尝试创建一个标记系统,而不是使用or ,而是使用。 我该如何使用而不是。我尝试做并添加,但是失败了。 问题答案: 您可以这样逃避它。 或只使用indexOf

  • 我使用wiremock来模拟某些请求及其相应的响应,但我试图添加一个正则表达式。不幸的是,这只会引发一个异常,表明请求不匹配。 我也试过了 我发送的请求是