【问题标题】:Matcher.replaceAll() and String.replaceAll() don't seem to work on Galaxy S 6Matcher.replaceAll() 和 String.replaceAll() 似乎不适用于 Galaxy S 6
【发布时间】:2016-12-12 09:04:39
【问题描述】:

我需要从字符串中删除一些字符。目前我正在尝试删除''(空格)和'-'(连字符)。我尝试了两种方法。他们都在装有 Android N Beta 的 Nexus 5X 上工作。它们都不适用于搭载 Android M 的三星 Galaxy S 6。

第一种方法:

String normalizedNumber = phoneNumber.replaceAll("[ -]", "");

第二种方法:

Pattern pattern = Pattern.compile("[ -]");
String normalizedNumber = pattern.matcher(phoneNumber).replaceAll("");

这样的基本类如何给出不同的结果?我做错了什么?

证明(调试器屏幕截图,在不同的 PC 上拍摄,这就是样式不同的原因):

这里是 Nexus

这里是三星

【问题讨论】:

  • 您确定所有设备的代码、程序流程和输入都相同吗?
  • 这似乎不太可能。你能证明这正在发生吗?。
  • @SamTebbs33 与我使用桌面上的 Android Studio 在两台设备上安装它们的代码相同。相同的程序流程,只调用一次,然后我在后面放了一个断点。
  • @shmosel 即使我用断点停止调试器并手动评估几个表达式,我也会得到相同的结果(似乎这些表达式是由 Android Studio 在设备上评估的)。你需要截图才能相信我吗?
  • @shmosel 还考虑到存在与此类基本类相关的错误:stackoverflow.com/questions/16475317/… 也许这是另一个在 AOSP 中修补但在三星代码中没有修补的实例?

标签: java android regex


【解决方案1】:

您能否尝试使用方法 1 进行以下修改:

String normalizedNumber = phoneNumber.replace(" ","").replace("-","");

希望这应该在任何环境中作为直接字符替换方法起作用,因为 replaceAll 始终是匹配字符的编译模式方法

【讨论】:

  • 我很确定这会奏效,谢谢。我会在星期一试试这个,因为三星手机是我同事的,不是我的。
【解决方案2】:

谜团解开了。当使用String.charAt() 分析字符串时,发现这些空格毕竟不是简单的空格,而是“non breaking spaces”(代码160)。更改代码以删除所有空格已修复它:

String normalizedNumber = phoneNumber.replaceAll("[\\s-]", "");

代码在不同的手机上给出了不同的结果,因为数字来自联系人选择器 Intent。三星手机存储空间的数字似乎与 Nexus 手机不同。

感谢大家的帮助。

https://en.wikipedia.org/wiki/Non-breaking_space

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-11
    • 2020-04-04
    • 2023-04-06
    • 2017-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多