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(
Matchdb.session\.commit\(\)
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}