之前我已经问了一个类似的问题并实现了这个正则表达式:"(?<!^)(?=\\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", ")"
。
谢谢
答案 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)");