如何修改读取向量的正则表达式以读取矩阵



我有以下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*)?\}"

但如果你能像上面那样拆分和构建它,它会更容易阅读。

最新更新