正则表达式问题模式匹配

时间:2016-03-29 12:39:40

标签: java regex

我正在尝试为下面的字符串模式

编写正则表达式
String str = "<name>{f:<one>,l:<two>,t:<three>} )";

这种模式以“?”结尾以下代码工作

String result = str.replaceAll(pattern, "abc");
System.out.println(result);

,输出

<name> ( abc abc)

但是如果输入字符串改变

下一个模式不会以?结尾?,Java挂起.....

String result = str.replaceAll(pattern, "abc"); 
System.out.println(result);

等效的Scala代码

pattern.replaceAllIn(str,"abc")

我错在哪里,提前谢谢

2 个答案:

答案 0 :(得分:0)

从你的例子来看,很难说你试图实现的目标是一些评论如何改进正则表达式:

你的正则表达式有几个奇怪的东西

  • (.)*如果您以后不想使用结果(?:)或至少更改为(.*)
  • ,则可能会创建无数个相对昂贵的捕获组
  • <\\S+?>更好地表达为<[^>]+>

与大多数匹配器一样,您使用的是非贪婪的方法,您可能会遇到一个糟糕的回溯问题,可以通过更改正则表达式来避免这种情况。

答案 1 :(得分:0)

如果你将你的正则表达式改为ie * at end

,它应该可行
String pattern = "\\{(((.)*?(<\\S+?>)?)+?)\\}\\?*";

或只是

String pattern = "\\{.*?(\\})(\\?)*";