Guava的Charmatcher方法(例如javaDigit())的替代方法?

时间:2019-02-24 15:21:07

标签: java guava deprecated

我使用Guava的CharMatcher已有很长时间了,它在所有方面都非常有效。现在,我看到其中的大多数方法现在在Guava 27.0.1中已弃用

文档说:“已弃用。许多数字是补充字符;请参阅类文档。”但是,在阅读了课程文档后,我仍然感到困惑。在大多数情况下,不赞成使用方法时,它们会告诉您另一种做事的方法,但是,这一次,我感觉文档基本上是在说“此类实际上无法正常工作,因此请不要使用它”

例如,仅保留字符串数字的正确方法是什么?在我干脆做之前:

String inputString = "abc123def456";
String outputString = CharMatcher.javaDigit().retainFrom(inputString);

2 个答案:

答案 0 :(得分:4)

该方法的Javadoc状态:

@deprecated Many digits are supplementary characters; see the class documentation.

这意味着除了通常使用的0到9之间的数字外,还可以匹配其他字符。

在Guava中,有两种内置方法:digit()javaDigit()。前者根据“ BMP ”的规范匹配“ Unicode”位数,而后者则根据“ Character#isDigit() ”的规范匹配“ BMP位数”。它们每个都匹配像Devanagari或Fullwidth之类的怪异字符 数字(我什至都​​不会链接它们;)),这很少是用户想要的,并且可能会引起误解。

这就是为什么(番石榴作者)首选的方式要明确的原因(稍后将在javadoc中进行说明):

  

如果您只想匹配ASCII数字,则可以使用CharMatcher#inRange('0', '9')

在您的情况下,只需使用:

String outputString = CharMatcher.inRange('0', '9').retainFrom(inputString);

答案 1 :(得分:0)

一个更通用的解决方案,因为我需要一个:用 CharMatcher.forPredicate 替换已弃用的方法,并传入 the Java Character class 中的一种字符分类方法。

CharMatcher.forPredicate(Character::isDigit).retainFrom(inputString)