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

时间:2016-03-21 18:56:19

标签: 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", ")"

现在我需要在相同条件下拆分String,但也要将十进制数保持在一起。 ATM,(0.5)之类的输入会产生:"(", "0", ".", "5", ")",但我需要将十进制数保持在一个string中,例如:"(", "0.5", ")"。 谢谢

1 个答案:

答案 0 :(得分:2)

您可以非常轻松地定义与几个不同令牌匹配的正则表达式,而不是在令牌之间进行拆分,例如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+)),您可以将其扩展为[()^*/+-](未测试)
  • -单个特殊字符,例如操作或括号。请注意,!=位于最后,因此不会将其解释为范围。如果您还有多个字符的运算符,例如<=+|-|==|<=|...,则可以将其更改为另一个析取:final Calendar first = new Calendar.Builder() .setDate(2016, 2, 1).set(Calendar.AM_PM, 0).set(Calendar.HOUR, 8).build(); final Calendar second = Calendar.getInstance(); int numberOfDays = 0; long numberOfHours = 0; //Get number of full days while(first.get(Calendar.DATE) != second.get(Calendar.DATE)){ if(Calendar.SATURDAY != first.get(Calendar.DAY_OF_WEEK) && Calendar.SUNDAY != first.get(Calendar.DAY_OF_WEEK)){ numberOfDays++; } first.roll(Calendar.DATE, true); } //Get number of hours in the remaining day numberOfHours = TimeUnit.MILLISECONDS .toHours(second.getTimeInMillis() - first.getTimeInMillis()); System.out.println("Difference = " + ( numberOfDays * 24 + numberOfHours ) + " hour(s)");