gpt4 book ai didi

java - 在 Java 中调试正则表达式

转载 作者:太空宇宙 更新时间:2023-11-04 07:32:16 25 4
gpt4 key购买 nike

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

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);

但我不知道为什么它不起作用,而且很难找到错误。那么问题是如何发现正则表达式中的错误?如何正确测试呢?是否有任何程序可以为我的正则表达式生成输出以了解其工作原理?

更新:我想我应该写更多关于这个字符串的性质的文章。正则表达式应该描述以​​特殊格式表示特殊类型多项式的所有字符串。格式为

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

最佳答案

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

^((\\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]+ x 0 次或多次。

参见here举个例子。

在您的代码中,可能是:

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

编辑:插入符号和引号放错了位置。

关于java - 在 Java 中调试正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17500864/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com