【发布时间】:2021-10-13 23:39:50
【问题描述】:
我正在尝试将应包含 Complex Number 的字符串解析为我编写的 ComplexNumber 类。
字符串应采用以下格式:
realNumber+imageNumberi,例如:14-3i。
我希望能够:
-
识别接收到的字符串是否有效。如果其中有任何不是
+、-、.或i或digit的字符,我希望能够抛出异常错误。例如,如果接收到的字符串是13a + 3i。 -
删除空格(我是使用
str.replaceAll完成的),例如:13 + i -
例如,当我终于有了看起来像
12-3i的“固定”字符串时,我希望能够将其拆分为12和3的 2 个双精度值。 -
如果需要,我还希望能够将
i更改为1或“-1”,例如:-15+i。
我读到了regex,所以我尝试使用String.match,但没有成功。
我还成功地提出了一个 50% 可行的解决方案。
这是我尝试这样做的一种方式。
遍历字符串,删除空格,然后遍历每个字符以检查其是否有效。我没有运气,因为它写道:Condition '!Character.isDigit(ch) || ch != '+' || ch != '-'' is always 'true' .
String parsed = str.replaceAll("\\s++", "");
for(int i = 0; i < parsed.length(); i++) {
char ch = parsed.charAt(i);
if (!Character.isDigit(ch) || ch != '+' || ch != '-')
{
System.out.println("invalid string.");
}
我也写试过了
if (!Character.isDigit(ch) || "+-".contains(ch))
和
if("~#@*+%{}<>[]|\"_^".contains(ch)){
但收到:
Required type: CharSequence Provided: char
以下解决方案有效但缺乏:
- 检查字符串是否有效。
- 如果之前收到的
i没有值,则将i更改为1。 - 确定其
+或-是图像编号。
代码:
String[] splitString = str.split("[+|s+|i]"); // removing spaces, plus sign and "i" from the string
Double[] complexNumberFields = new Double[2];
complexNumberFields[0] = Double.parseDouble(splitString[0]);
complexNumberFields[1] = Double.parseDouble(splitString[1]);
}
return new ComplexNumber(complexNumberFields[0], complexNumberFields[1]);
我应该如何在不使用parser 或matcher 的情况下以最佳方式实现此功能(因为我还没有阅读它们)。我希望它通过正则表达式和字符串操作来完成。
当然没有使用任何ComplexFormat 方法,因为我正在实现我自己的ComplexNumber 类。
【问题讨论】:
-
我必须是第一个在这里说正则表达式并不是真正(尽管看起来)构建表达式解析器的合适工具
-
@g00se 我的意思是使用正则表达式来确定字符串是否有效以及是否包含无效字符。
-
@g00se =) 这取决于你将如何使用它 =) (检查我的答案)
-
立即假设表达式以两位数开头。为什么?
标签: java string parsing string-matching