Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 仅使用正则表达式检查一个短语在文档中是否至少出现N次_Regex - Fatal编程技术网

Regex 仅使用正则表达式检查一个短语在文档中是否至少出现N次

Regex 仅使用正则表达式检查一个短语在文档中是否至少出现N次,regex,Regex,例如,我有一个玩具文本/代码: db.session.commit() #回滚 user=user.query.get(1) 打印(“一些打印输出”) db.session.rollback() 打印(“\n提交更改:”) db.session.commit() 我想编写一个基于JavaScript的正则表达式,以检查是否至少写入了db.session.commit(),例如,2次。如果写的次数少于2次,匹配就会失败(我会用它来测试代码)。这应该适用于任意N次(2,3,…) 我在Regex10

例如,我有一个玩具文本/代码:

db.session.commit()
#回滚
user=user.query.get(1)
打印(“一些打印输出”)
db.session.rollback()
打印(“\n提交更改:”)
db.session.commit()
我想编写一个基于JavaScript的正则表达式,以检查是否至少写入了
db.session.commit()
,例如,2次。如果写的次数少于2次,匹配就会失败(我会用它来测试代码)。这应该适用于任意N次(2,3,…)

我在Regex101上尝试了无数种组合,包括{}重复和(非)捕获组,但到目前为止没有任何效果。我还在学习。我成功地做到了这一点:但当您在两次提交(或其他任何地方)之间的空白处放置某个内容时,它就失败了。我在其他任何地方都没有发现类似的问题(这也可能意味着这是微不足道的lol)。我知道我可以使用for循环,但在这种情况下,我只能使用regex


非常感谢您提供的任何帮助。

您可以匹配整条线并将其捕获到组1中。然后匹配一个新行,后跟0+空格字符,并使用backreference
\1
再次匹配该新行

^(db\.session\.commit)\r?\n\s*\1

如果要将示例数据与它匹配2次,但中间可能还有其他行:

^(db\.session\.commit\(\))(?:\r?\n(?!\1).*)*\r?\n\1
部分地

  • ^
    行的开头
  • Capturegroup 1
    • db.session\.commit\(\)
      Match
      db.session.commit()
  • 关闭组
  • (?:
    非捕获组
    • \r?\n
      匹配换行符
    • (?!\1)。*
      断言直接右侧的内容不是使用反向引用在组1中捕获的内容。如果是这种情况,请匹配整行内容
  • )*
    关闭分组并重复0多次
  • \r?\n
    匹配换行符
  • \1
    反向引用组1中捕获的内容
试试:

(db\.session\.commit\(\))[\s\S]*?\1

(db\.session\.commit\(\))  # matches: db.session.commit() in capture group 1
[\s\S]*?                   # matches any character including newline non-greedily 0 or more times
\1                         # matches capture group 1, i.e. db.session.commit()
上面应该可以在字符串的任意位置找到
db.session.commit()
的任意两个匹配项,无论是否在同一行


您在哪个环境中运行正则表达式?壳JAVAPerl?python其他语言?计算匹配比多次匹配输入的一部分要有效得多。我正在使用其他人的测试引擎,他们正在使用问题中提到的JavaScript。我知道还有其他方法可以做到这一点,但在这个特定的例子中,我只能输入一个正则表达式,而我无法访问它们的全部代码。@mishsx请再次阅读问题
我想编写一个基于JavaScript的正则表达式,以检查db.session.commit()是否至少编写了两次。
在这种情况下,为什么我们要把事情复杂化。相反,我们只需完成
/(db\.session\.commit\s?\r?{2}/g
如果我在这里出错,请纠正我。但是我能够将至少两次出现的上述文本与我的正则表达式进行匹配。好吧,正则表达式与示例正则表达式链接中的内容不匹配,即使删除了中间的空格,它仍然需要在末尾添加一个空格字符,该字符与这个@Irma不匹配,然后您必须使用第二种模式
^(db\.session\.commit)(?:\r?\n(?!\1)。*)*\r?\n\1
@Irma您可以这样做,其中结尾的
{2}
可以是3或4等
^(db\.session\.commit)(?:(?:\r?\n(?!\1)。*\r?\n\1{2}