2

所以我正在编写我自己的toString()方法变体,基本上当您调用该方法时,您传入一个字符串,然后传入一个参数toString(Object... args)。像这样

this.toString("%8s", this.log, "%n%s %s", this.theMap, "%s", this.countIterator());

然后我使用下面的代码来查看传入的参数是常规字符串还是格式字符串。

if(args[i].getClass().getName() == "java.lang.String") {
  if(args[i].toString().contains("%\\-?[1-9]s?*")) {

    format = args[i].toString();

  } else {

    s += args[i].toString();

  }
}

args[i].toString().contains("%\\-?[1-9]s?*")则表达式不起作用,但是当我使用 args[i].toString().matches("%\\-?[1-9]s?*")它时,它仅适用于带有%s%9s不带有%s %9sor的实例的 String 实例%s%s %s。当我s将正则表达式中的 替换为dor时,它也有效n

我知道您在问为什么要重新发明轮子,只需使用String.format(),而我应该只是因为我有这个想法并且在解决它之前不能做任何其他事情。

我还尝试复制和粘贴java.util.Formatter班级的
"%(\\d+\\$)?([-#+ 0,(\\<]*)?(\\d+)?(\\.\\d+)?([tT])?([a-zA-Z%])"正则表达式,但它的作用与上面相同,并且仅适用于%sor %9s

我还注意到,在 Formatter 类中,开发人员使用了 Matcher 类的一个实例和一个 Patern 类的实例,并使用一个 for 循环来运行 String 并匹配模式的每个实例并将其存储到 ArrayList 中。我真的不想这样做,我只是想看看 String 参数是否有一个%nor %sor实例,%d然后将其存储在一个 String 中,稍后将与String.format(format, argument);.

因此,如果有人可以帮助我,那就太棒了!
谢谢你读到这里。

4

1 回答 1

3

尝试这个

Pattern p = Pattern.compile("(%[0-9]*(s|d|n))");
System.out.println("match: " + p.matcher(str).find());

您可以将模式存储为全局或静态变量,并在需要时重用它。

于 2012-04-05T20:49:21.290 回答