默认情况下将Java中的RegEx设置为非贪婪

Bas*_*nck 3 java regex string

我有如下字符串:

"parameter: param0=true, param1=401230 param2=asset client: desktop"
"parameter: param0=false, param1=15230 user: user213 client: desktop"
"parameter: param0=false, param1=51235 param2=asset result: ERROR"
Run Code Online (Sandbox Code Playgroud)

模式是parameter:,然后param是 ,参数后面是client:and/oruser:和/or result。

parameter:我想匹配和 第一次出现之间的内容client:,user:或者result:

所以对于第二个字符串它应该匹配param0=false, param1=15230。

我的正则表达式是:

parameter:\s+(.*)\s+(result|client|user):
Run Code Online (Sandbox Code Playgroud)

但现在如果我匹配它捕获的第二个字符串param0=false, param1=15230 user: user213(看起来正则表达式正在匹配贪婪)

  1. 如何解决这个问题?parameter:\s+(.*)\s+(result|client|user)+?:不会修复它
  2. 有了这个正则表达式测试器,我可以向正则表达式添加修饰符U,使正则表达式默认变得惰性,这在 Java 中也可能吗?

man*_*uti 5

尝试将?字符放入第一个捕获的组中(您想要提取的子模式):

parameter:\\s+(.*?)\\s+(result|client|user):
Run Code Online (Sandbox Code Playgroud)


Uni*_*ron 5

不。Java 中没有 ungreedy 修饰符。您必须使用?后面的修饰符来使量词成为延迟捕获。

这意味着您应该用 表示所有量词?,请参阅以下模式:

"parameter:\\s+?(.*?)\\s+?(result|client|user):"
Run Code Online (Sandbox Code Playgroud)

指定者: http:
//docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html