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

时间:2018-11-29 18:57:46

标签: java regex matrix vector token

我有以下正则表达式可读取任何大小的数组,例如{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}}等?

2 个答案:

答案 0 :(得分:1)

我认为您只需要添加外部花括号并使用可选的逗号重复现有模式即可: 字首: {(。           外面的花括号和开口括号使现有的正则表达式可以重复。

"\\{\\s*((-?\\b\\d+(?:\\.\\d+)?(?:/\\d+(?:\\.\\d+)?)?\\b)+(\\s*,\\s*(-?\\b\\d+(?:\\.\\d+)?(?:/\\d+(?:\\.\\d+)?)?\\b)+)*\\s*)?\\}"

追加:,?)+}。      逗号-问号使其可选      然后关闭括号并允许其重复1次或更多次      最后是外花括号

将其放在一起并添加获取以下内容所需的转义符:

"\\{(\\{\\s*((-?\\b\\d+(?:\\.\\d+)?(?:/\\d+(?:\\.\\d+)?)?\\b)+(\\s*,\\s*(-?\\b\\d+(?:\\.\\d+)?(?:/\\d+(?:\\.\\d+)?)?\\b)+)*\\s*)?\\},?)+\\}"

答案 1 :(得分:1)

为了使其更具可读性,您的正则表达式可以写为

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*)?\\}"

但是,如果您可以像上面那样拆分和构建它,那么它会更容易阅读。