java - 正则表达式用于分割每个字符,但将数字和小数保留在一起

标签 java regex

我之前问过一个非常类似的问题并实现了这个正则表达式:"(?<!^)(?=\\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/

相关文章:

java - 对名称 java : comp/env/jdbc/bar 进行间接查找时发生 WebSphere NameNotFoundException

java - 从 BufferedImage 读取像素 - 错误的颜色值

Java:如何从 HTML 标签中剥离文本内容?

sql - 错误:“ON a.guest_id”中出现意外符号

java - Postgresql 无法接受 SSL 连接 : sslv3 alert certificate unknown

java - 如何使用 Spring Boot 设置 JSESSIONID cookie 的过期日期时间

java - NewStringUTF 是否复制传入的 const char *

regex - ?>(原子分组)正则表达式构造的实际应用?

java - 如何在 Java 中从日期中删除序数值

javascript - 非捕获组仍在比赛中显示