文字列で機能する正規表現を作成しようとしています。
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] +
そして、エラー位置に関する情報を含む例外をスローする次の正規表現とコードを作成しました。
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 の間違いを見つける方法です。それを適切にテストする方法は?正規表現がどのように機能するかを調べるために出力を生成するプログラムはありますか?
更新:この文字列の性質についてもっと書くべきだと思います。正規表現は、特殊な種類の多項式を表すすべての文字列を特殊な形式で記述する必要があります。フォーマットは
- Polynomial は + で区切られた単項式のリストです。(例
m1 + m2 + m3
) - Monomial は、数値、またはスペースで区切られた角括弧内の数値のリストです。または、数値と数値のリストの両方を含めることができます。(例:
2[1 2 3]
、2
)[2 3 4]
- 他のすべての文字列は拒否する必要があります