如何在一些'#'之间匹配java正则表达式?

时间:2018-05-29 09:55:43

标签: java regex string

我遇到了String.replaceFirst方法的问题。 我有以下字符串:

String content = "select * from queries 
                 where update_date >= to_timestamp('#date|Date debut|dd/MM/yyyy# 00:00:00','DD/MM/YYYY HH24:MI:SS') 
                 and update_date <= to_timestamp('#date|Date fin|dd/MM/yyyy# 23:59:59','DD/MM/YYYY HH24:MI:SS')";

(&#39;#&#39;之间的两个表达式是动态定义的)。 我也有两个约会:

String begin = "28/05/2018";
String end = "29/05/2018";

然后我会用begin替换第一个表达式,用end结束第二个表达式。

我用:

content = content.replaceFirst("#(date)\\|(.*)\\|(.*)#", begin);
content = content.replaceFirst("#(date)\\|(.*)\\|(.*)#", end);

尽管如此,replaceFirst需要最后一次&#39;#&#39;整个String我得到了:

select * from queries where update_date >= to_timestamp('28/05/2018 23:59:59','DD/MM/YYYY HH24:MI:SS');

我理解错误,但我请你帮我找到解决方案。 非常感谢 !阿克塞尔。

3 个答案:

答案 0 :(得分:0)

在阅读你的问题时,我不确定#s之间的文字(我的意思是“日期|日期首次亮相| dd / MM / yyyy”和“date | Date fin | dd / MM / yyyy”)是否是动态的定义或者如果您只是在解释您想要动态地用动态定义的日期替换上面的修复内容。

所以我会给你两个答案(两者都应该有效)。

  1. 如果文字是固定的:
    #date \ | Date debut \ | dd / MM / yyyy# - 第一个范围
    #date \ | Date fin \ | dd / MM / yyyy# - 第二个范围

  2. 如果#之间的文字没有修复:
    #[^#] *#

  3. 上面的正则表达式意味着找到以#开头的一系列字符,而不是包含除#以外的任何字符,这是[^#]的意思,0或几次(*),以#结束

    我希望它有所帮助!

答案 1 :(得分:0)

如果您的问题代码似乎想要查找两个替换的通用正则表达式,那么这就是如何使其工作:

默认情况下捕获所有字符的.*的正则表达式为greedy,这意味着它会尝试捕获尽可能多的字符。这就是为什么你的第一次替换取代了所有。

您可以使用lazy量词?来确定您希望捕获的字符数尽可能少,而不是最多。

尝试:

#(date)\|(.*?)\|(.*?)#

(或代码的转义版本:"#(date)\\|(.*?)\\|(.*?)#"

see regex in regex101

答案 2 :(得分:0)

试试这个:

std::string

这里我们不需要使用(),我们匹配直到我们的角色像|或#matse。