【问题标题】:How To Extract Numbers from a String without regex [duplicate]如何在没有正则表达式的情况下从字符串中提取数字
【发布时间】:2018-03-17 17:27:44
【问题描述】:

我想从字符串中提取Numbers,示例消息是这样的

您好,您的帐号 NO 295093491783 已被 17820 扣款。如果您没有收到确认电话 9897123456。

现在我像这样使用谷歌的番石榴

String temp = CharMatcher.JAVA_DIGIT.retainFrom(message);

我得到的结果类似于 295093491783178209897123456,而我想要的格式是

String[] a = {"295093491783", "17820", "9897123456"}

任何帮助将不胜感激。我想使用 guava 库来做到这一点。

注意:-

  1. 我不想使用正则表达式,因为CharMatcher 比正则表达式快。

  2. 我当前的解决方案几乎以 6000 tps(每秒事务数)运行。

【问题讨论】:

  • 你每秒需要处理多少个?
  • 现在我的解决方案几乎以 6000 TPS(每秒事务数)运行
  • @PrakharNigam 您能否对正则表达式和匹配器解决方案进行基准测试?
  • @nullpointer 尚未进行基准测试...仍在继续

标签: java arrays string parsing guava


【解决方案1】:

这可能对你有用:

static String[] getNumbers(String from) {
    List<String> numbers = new ArrayList<>();
    StringBuilder number = new StringBuilder();
    for (int i = 0; i < from.length(); i++) {
        char c = from.charAt(i);
        if (Character.isDigit(c)) {
            number.append(c);
        } else if (number.length() > 0){
            numbers.add(number.toString());
            number.setLength(0);
        }
    }
    if (number.length() > 0) {
        numbers.add(number.toString());
    }
    return numbers.toArray(new String[numbers.size()]);
}

但您是否真的对正则表达式解决方案进行了基准测试?

【讨论】:

  • 直到现在我还没有对 RegEx 解决方案进行基准测试。
  • @PrakharNigam 让我知道结果,似乎是不使用正则表达式的微优化,因为您的输入是如此之小。
  • @KarolDowbecki 实际上这是一条消息的单个片段。我的实际消息可以是多部分的,最少有 3 个片段,最多 256 个片段。我正在比较两种解决方案,我将很快分享两者的分数
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-05-04
  • 1970-01-01
  • 2021-10-09
  • 2021-12-16
  • 2011-05-10
  • 2014-08-25
  • 1970-01-01
相关资源
最近更新 更多