gpt4 book ai didi

Java 正则表达式捕获任何 (.*) 与 DOTALL 忽略零宽度正先行

转载 作者:行者123 更新时间:2023-11-29 06:04:25 26 4
gpt4 key购买 nike

不是正则表达式专家,但我知道的足够危险,需要一些关于我正在处理的表达式的帮助。长话短说,最近的一次数据库升级使我支持的遗留应用程序的字符串文字中的数千个查询无效。我正在编写一些表达式来捕获其中的大部分,并希望以编程方式修复它们。

考虑以下几点:

Query query = session
.createSQLQuery("SELECT distinct p.userid, p.name, f.hsid, "
+ "p.vid, p.vname, p.paymentdate, p.amount "
+ "FROM vk.payment p, (select * from vs.fuser) fu, (select * from vs.fac) f "
+ "WHERE p.description = 'Check' AND "
+ "p.paymentdate >= :startDate and p.paymentdate <= :endDate AND "
+ "fu.userid = p.userid AND fu.facid = f.facid "
+ "ORDER BY p.userid");
query.setParameter("startDate", startDate);
query.setParameter("endDate", endDate);

我有以下 DOTALL 表达式来 try catch 方法参数的丑陋内容。

(?s)(?<=\.createSQLQuery\(")(.*)(?="\)\;)

我用 (?s) 指定 DOTALL 标志,一个非捕获的后视得到 \.createSQLQuery\(",用 捕获包括换行符在内的所有内容>(.*),最后是一个非捕获正向前瞻,以在 "\)\; 处停止捕获。

我希望捕获以下内容:

SELECT distinct p.userid, p.name, f.hsid, "
+ "p.vid, p.vname, p.paymentdate, p.amount "
+ "FROM vk.payment p, (select * from vs.fuser) fu, (select * from vs.fac) f "
+ "WHERE p.description = 'Check' AND "
+ "p.paymentdate >= :startDate and p.paymentdate <= :endDate AND "
+ "fu.userid = p.userid AND fu.facid = f.facid "
+ "ORDER BY p.userid

相反,该表达式比我预期的要贪婪得多,并且正在捕获它:

SELECT distinct p.userid, p.name, f.hsid, "
+ "p.vid, p.vname, p.paymentdate, p.amount "
+ "FROM vk.payment p, (select * from vs.fuser) fu, (select * from vs.fac) f "
+ "WHERE p.description = 'Check' AND "
+ "p.paymentdate >= :startDate and p.paymentdate <= :endDate AND "
+ "fu.userid = p.userid AND fu.facid = f.facid "
+ "ORDER BY p.userid");
query.setParameter("startDate", startDate);
query.setParameter("endDate", endDate);
... to EOF

问题是,如果没有 DOTALL,表达式将按预期在一行中工作:

Query query = session.createSQLQuery("SELECT .... ");

并在最后没有剩余字符的情况下进行捕获...<​​/p>

SELECT .... 

是否有 DOTALL 的某些方面是每个正则表达式专家似乎都知道但似乎没有在任何地方记录的? DOTALL 是否不适用于正面前瞻?

感谢您的帮助!

最佳答案

通过在其后添加 ? 使 * 量词成为非贪婪的,如下所示:.*?

另外,您为什么还要使用环顾四周?在某些情况下,不加考虑地使用它们可能会导致不良行为。 (这总是让我恼火。(-;)

你可以使用:

(?s)\.createSQLQuery\("(.*?)"\);

关于Java 正则表达式捕获任何 (.*) 与 DOTALL 忽略零宽度正先行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9034582/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com