不是正则表达式专家,但是我知道足够危险,需要一些我正在研究的表达式的帮助。简而言之,最近的数据库升级使我支持的旧应用程序的字符串文字中的数千个查询无效。我正在写一些表达式来捕获其中的大部分,并希望通过编程来解决它们。

考虑以下:

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表达式来尝试并捕获方法参数的丑陋内容。

(?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 .... ");


并捕获最后没有剩余字符的...

SELECT ....


是否有DOTALL的某些方面,每个正则表达式专家似乎都知道,似乎没有任何地方进行记录? DOTALL不能与正向提前配合使用吗?

感谢您的帮助!

最佳答案

通过在其后添加*来使?量词不贪心,如下所示:.*?

另外,为什么还要使用环顾四周?在某些情况下,如果没有这样的想法就使用它们可能会导致不良行为。 (这总是让我感到恼火。(-;)

您可以使用:

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

关于java - Java Regex使用DOTALL捕获任何(。*)都会忽略零宽度正向超前,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9034582/

10-09 00:11