我有以下regex,它可以读取任何大小的数组,如{1.0,2,3,5.4}:
"\{\s*((-?\b\d+(?:\.\d+)?(?:/\d+(?:\.\d+)?)?\b)+(\s*,\s*(-?\b\d+(?:\.\d+)?(?:/\d+(?:\.\d+)?)?\b)+)*\s*)?\}"
我如何修改它,使其读取任何维度的矩阵,如:{{1.2,3,4},{2,3.4,3}}等?
我认为您只需要添加外部大括号,并使用可选逗号重复现有模式:前缀:{(。外部大括号和一个左括号,以便可以重复现有的正则表达式。
"\{\s*((-?\b\d+(?:\.\d+)?(?:/\d+(?:\.\d+)?)?\b)+(\s*,\s*(-?\b\d+(?:\.\d+)?(?:/\d+(?:\.\d+)?)?\b)+)*\s*)?\}"
append:,?(+}。逗号-问号使其可选然后关闭括号,让它重复1次或多次最后是结束的外花括号
把它放在一起,并添加获得所需的转义:
"\{(\{\s*((-?\b\d+(?:\.\d+)?(?:/\d+(?:\.\d+)?)?\b)+(\s*,\s*(-?\b\d+(?:\.\d+)?(?:/\d+(?:\.\d+)?)?\b)+)*\s*)?\},?)+\}"
为了使其更具可读性,您的正则表达式可以写成
String numRegex = "(-?\b\d+(?:\.\d+)?(?:/\d+(?:\.\d+)?)?\b)+";
String regex = "\{\s*(" + numRegex + "(\s*,\s*" + numRegex + ")*\s*)?\}";
虽然我确实认为numRegex
部分是不正确的,因为它允许像1/2-3.4/5-6/7
这样的文本
现在你想把它包装在{ xxx , xxx , ... }
结构中,所以
String regex2 = "\{\s*(" + regex + "(\s*,\s*" + regex + ")*\s*)?\}";
测试
System.out.println("{{1.2, 3,4},{2,3.4,3}}".matches(regex2));
System.out.println("{{1.2, 3,4},{2,3.4,3},}".matches(regex2));
输出
true
false
作为一个单独的长正则表达式,它将是
"\{\s*(\{\s*((-?\b\d+(?:\.\d+)?(?:/\d+(?:\.\d+)?)?\b)+(\s*,\s*(-?\b\d+(?:\.\d+)?(?:/\d+(?:\.\d+)?)?\b)+)*\s*)?\}(\s*,\s*\{\s*((-?\b\d+(?:\.\d+)?(?:/\d+(?:\.\d+)?)?\b)+(\s*,\s*(-?\b\d+(?:\.\d+)?(?:/\d+(?:\.\d+)?)?\b)+)*\s*)?\})*\s*)?\}"
但如果你能像上面那样拆分和构建它,它会更容易阅读。