【问题标题】:Pattern matching difference between java and android?java和android的模式匹配区别?
【发布时间】:2016-03-03 15:42:41
【问题描述】:

在 java 中 match var 的计算结果足够有趣(或不有趣),但在 android 中却没有:

CharSequence target = "man on";
boolean match = ​target.toString().matches("(\\p{L}\\p{L}+-?\\s?\\p{L}+)+"); 

知道为什么会这样吗?

谢谢。

PS:我通过导入和使用 Matcher 使其工作。

Pattern pattern = Pattern.compile("(\\p{L}\\p{L}+-?\\s?\\p{L}+)+");
Matcher matcher = pattern.matcher(target);

然后 matcher.matches() 在“man on”上计算为真。

【问题讨论】:

  • 你为什么要在String上打电话给toString
  • 一定是关于android实现String.matches的方式,因为你基本上只是内联了String.matches在第二种情况下的工作方式(grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/…
  • @fabian: 对不起,我把代码贴在这里了,编辑得不好。在 android 应用程序中没有 String target = "man on" 目标实际上是一个 CharSequence .. :) 实际上我只是测试了它,第二个适用于“man on”而不是“man on moon”。由于 ()+ 或,应该是哪种情况?当然,在 browxy.com boolean bla = args[0].toString().matches("(\\p{L}\\p{L}+-?\\s?\\p{L}+)+"); 甚至适用于“月球上的人 bla 鱼”..
  • 似乎您的CharSequence 错误地实现了toString()Pattern.matcher() 可以接受 CharSequence 参数,我相信它使用 charAt() 搜索匹配项
  • @SashaSalauyou,是的,一旦我更改为 Pattern/Matcher,我就放弃了 toString(),因为 matcher() 接受了 CharSequence。我刚刚测试过,使用 toString() 与否没有区别,“man on”评估为 true,任何带有第二个空格的内容(即“man on moon”)评估为 false。

标签: java android regex


【解决方案1】:

我认为这里的问题在于CharSequence 方法的错误实现,或者target 的实际类中没有覆盖toString()

Pattern#matcher(target) 接受 CharSequenceString#matches()String 上运行。如果target.toString() 返回的字符串与target 的实际内容不相等,结果可能会有所不同。

【讨论】:

    猜你喜欢
    • 2018-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-20
    • 2012-04-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多