我之前问过一个非常类似的问题并实现了这个正则表达式:"(?<!^)(?=\\D)|(?<=\\D)"
分割String
像这样:
String input = "x^(24-3x)";
String[] signs = input.split("regex here");
for (int i = 0; i < signs.length; i++) {
System.out.println(signs[i]); }
输出结果为:
"x", "^", "(", "24", "-", "3", "x", ")"
现在我需要在相同的条件下拆分字符串,但还要将十进制数字保留在一起。
ATM,输入如 (0.5)
结果是:"(", "0", ".", "5", ")"
但我需要十进制数字保持分组为一个 string
例如:"(", "0.5", ")"
。
谢谢
最佳答案
您可以很容易地定义一个匹配多个不同标记的正则表达式,而不是在标记之间进行拆分,例如[0-9]+|[a-z]+|[()^*/+-]
,即一个或多个数字或一个以上字母或任何单个特殊字符。在实践中,这可能需要更多的阐述,例如考虑小数:
List<String> tokens = new ArrayList<>();
Pattern p = Pattern.compile("(\\d+(\\.\\d+)?)|[a-zA-Z]+|[()^*/+-]");
Matcher m = p.matcher("exp(42) * x^(24-3x) - 3.14");
while (m.find()) {
tokens.add(m.group());
}
tokens
的结果是 [exp, (, 42, ), *, x, ^, (, 24, -, 3, x, ), -, 3.14]
仔细看看正则表达式的组成部分:
-
(\\d+(\\.\\d+)?)
一些数字,可选地后跟一个点和更多数字。如果您还想允许诸如.1
之类的数字或42.
你需要稍微改变一下。 -
[a-zA-Z]+
一个或多个字母;如果你想允许变量带有下划线或数字,例如var_23
,您可以将其扩展为类似([a-zA-Z_]\w+)
的内容(未测试) -
[()^*/+-]
单个特殊字符,例如运算符或括号。请注意-
最后出现,因此它不会被解释为范围。如果您还有多字符运算符,例如!=
或<=
,您可以将其更改为另一个析取:+|-|==|<=|...
关于java - 正则表达式用于分割每个字符,但将数字和小数保留在一起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36139360/