Java Regex:模式的“ 10 {1,1%d},10 {2,1%d}”的正则表达式是什么?

时间:2019-03-15 04:44:56

标签: java regex pattern-matching

考虑以下示例:

Regex: (.\*?),(.\*)
String: 10,20
Result: Group1: 10; Group2: 20

类似地,

Regex: ???
String: 10{1,1 %d},10{2,1 %d}
Expected result: Group1: 10{1,1 %d}; Group2: 10{2,1 %d}

在第二个示例中,字符串多次包含“,”,这将导致意外输出。在这种情况下,我们如何才能达到预期的结果?

1 个答案:

答案 0 :(得分:0)

小心分割

因此,除非您将逗号括在一对匹配的定界符(例如“ {} [] <> ||””)中,否则听起来好像要用逗号分隔字符串。目前,我假设此文件将是常规文件,并且没有嵌套标记。

因此,要找到所有这些组,我们希望将匹配项视为除逗号之外的任何字符串, AND 如果您有周围的标记,则部分匹配项是有效的。


代码

String pattern = "[^,]*?({.*?}|\[.*?]|<.*?>|\|.*?\|)[^,]*?";
Pattern p = Pattern.compile(pattern);

此模式应为您完成。它会匹配任何以逗号开头的字符串,并且在“ {} [] <> ||”中具有某种包装器并且可能以一些文本结尾。您甚至可以将pattern包装在一组中并重复进行。像这样:

String pattern = "([^,]*?({.*?}|\[.*?]|<.*?>|\|.*?\|)[^,]*?)+"; // Notice the parens on the outside and the '+'
Pattern p = Pattern.compile(pattern);

如果括号是可选的,请考虑:

String pattern = "[^,]*?({.*?}|\[.*?]|<.*?>|\|.*?\|)?[^,]*?"; // Notice the added '?'
Pattern p = Pattern.compile(pattern);

我完全忘记了用于搜索字符串以获取多个结果的java实现是什么,但这在python中使用searchmatchfinditer方法以及模式仍可与Java一起使用。