1

我正在尝试编写一个适用于字符串的正则表达式:

2[23 3] + [1 22 3] + 7
[2] + [12351]
12[45 12]
[56]
[2] + 1 + [2]

但它也应该在字符串上抛出异常:

2[2 a]
1[2 3 4] + []
3[2 3 4] + a[1 2 3] 
3[2 3 4] + 

我编写了以下 RegEx 和代码,该代码会引发异常,其中包含有关错误位置的信息:

String sVariables = "(\\[(\\d+)(\\s+\\d+)*\\])";
String sMonomial = "((\\d+" + sVariables + "?)|" + sVariables + ")";
Pattern p = Pattern.compile(sMonomial + "(\\s+\\+\\s+" + sMonomial + ")");
Matcher m = p.matcher(sPolynomial);
if (m.find() && m.end() != sPolynomial.length()) 
    throw new FileParseException(sPolynomial, m.end(), lineNumber);
else if (!m.find())
throw new FileParseException(sPolynomial, 1, lineNumber);

但我不知道为什么它不起作用,而且很难找到错误。所以问题是如何在 RegEx 中找到错误?如何正确测试它?是否有任何程序可以为我的 RegEx 生成输出以了解它是如何工作的?

更新:我想我应该写更多关于这个字符串的性质。RegEx 应该以特殊格式描述所有表示特殊类型多项式的字符串。格式是

  1. 多项式是用 + 分隔的单项式列表。(例如m1 + m2 + m3
  2. 单项式是一个数字,或用空格分隔的方括号中的数字列表,或者它可以同时包含数字和数字列表。(例如2[1 2 3], 2, [2 3 4]
  3. 所有其他字符串都应该被拒绝
4

1 回答 1

1

你可以试试这个正则表达式:

^((\\d+)?\\[[ \\d]+\\]|\\d+)(\\s*\\+\\s*(\\d+)?\\[[ \\d]+\\]|\\s*\\+\\s*\\d+)*$

它可以分为第一组:

(\\d+)?\\[[ \\d]+\\]

匹配x[y z]东西(其中 x、y 和 z 是数字)。

\\d+

匹配没有任何[x y]与他们的数字。

(\\s*\\+\\s*(\\d+)?\\[[ \\d]+\\]|\\s*\\+\\s*\\d+)*

这匹配+ x[y z]+ x0 次或更多次。

有关示例,请参见此处。

在您的代码中,它可能是:

String sVariables = "(\\d+)?\\[[ \\d]+\\]";
String sMonomial = "(" + sVariables + "|\\d+)";
Pattern p = Pattern.compile("^" + sMonomial + "(\\s+\\+\\s+" + sMonomial + ")*$");

编辑:错位插入符号和引用。

于 2013-07-06T07:54:26.147 回答