【发布时间】:2016-10-01 01:22:44
【问题描述】:
给定一个随机字符串,我希望能够从我的字符串中提取某些字符(+,-,*,/),一个接一个。
假设字符串是wejri+234-wer*324sdf/
如何检索这 4 个运算符?
如果我必须提取这些运算符之间的所有内容,我会使用 String.split("\\+|\\-|\\*|\\/");,但如果我必须反过来这样做,我将如何实现?
这些运算符之间的字符数量可能会有很大差异。
【问题讨论】:
给定一个随机字符串,我希望能够从我的字符串中提取某些字符(+,-,*,/),一个接一个。
假设字符串是wejri+234-wer*324sdf/
如何检索这 4 个运算符?
如果我必须提取这些运算符之间的所有内容,我会使用 String.split("\\+|\\-|\\*|\\/");,但如果我必须反过来这样做,我将如何实现?
这些运算符之间的字符数量可能会有很大差异。
【问题讨论】:
您可以使用正则表达式删除除+, -, *, / 之外的所有字符:
String text = "wejri+234-wer*324sdf/";
String res = text.replaceAll("[^+\\-\\*/]", ""); // - and * need to be escaped
// > res = "+-*/"
【讨论】:
你可以使用Guava的CharMatcher:
System.out.println(
CharMatcher.JAVA_LETTER_OR_DIGIT
.and(CharMatcher.ASCII)
.removeFrom("wejri+234-wer*324sdf/"));
输出:
+-*/
或者,如果你想使用正则表达式,我会选择 \w 字符类:
System.out.println("wejri+234-wer*324sdf/".replaceAll("\\w+",""));
更新:CharMatcher.JAVA_LETTER_OR_DIGIT 已弃用,并且没有规范替换,但您可以轻松滚动自己的:
private static final CharMatcher JAVA_LETTER_OR_DIGIT =
CharMatcher.forPredicate(Character::isJavaIdentifierPart)
.precomputed();
请注意,您希望将其存储在一个常量中,因为预计算是一项成本适中的操作,而且您不希望每次都这样做。
【讨论】: