【问题标题】:Regex for finding Java's format strings in JavaScript用于在 JavaScript 中查找 Java 格式字符串的正则表达式
【发布时间】:2013-08-19 00:11:43
【问题描述】:

在 Java/Android 中,您可以使用格式字符串来指定某些 Outlook 的外观。例如,这些格式字符串可以传递给String.format()Formatter()

简单的例子是%s%1$d

现在我想编写一个在 JavaScript 中工作的正则表达式,让您从给定的文本中提取 Java 的格式字符串。

我的解决方案是以下正则表达式:

%(([0-9]+\$)?)([,+ (\-#0]*)([0-9]*)(.[0-9]*)((hh|h|l|ll|L|z|j|t)*)(d|i|u|f|F|e|E|g|G|x|X|o|s|S|c|C|a|A|b|B|h|H|p|n|%)

但是,这甚至不适用于最简单的情况 (%s)。但它似乎适用于所有其他(更复杂的)情况。

我在这里要问的是:您认为这是一个好的(正确的)正则表达式还是缺少什​​么?

我的语法来源是:Android's Formatter classprintf format strings

【问题讨论】:

    标签: java javascript android regex string-formatting


    【解决方案1】:

    问题出在这个群里:(.[0-9]*)

    您首先期望%,然后上述组中的. 期望其中一个(不是可选的)。那么(d|i|u|f|F|e|E|g|G|x|X|o|s|S|c|C|a|A|b|B|h|H|p|n|%) 也在期待什么。

    所以基本上,您的正则表达式中唯一的必需项是:
    1.%
    2.(.[0-9]*)中的.
    3.(d|i|u|f|F|e|E|g|G|x|X|o|s|S|c|C|a|A|b|B|h|H|p|n|%)

    %s 中没有空间来容纳 %. 以及您想要提取 s 的块。

    我不确定您希望 (.[0-9]*) 是什么,但将其设为可选,例如 (.[0-9]*)?,至少可以让 %s 通过。

    【讨论】:

    • 哦,是的,当然! :) 谢谢!如果您查看我的问题中的一个链接,您会发现该组是为了精确。精度是可选的,但在指定时,必须以点开头。所以(.[0-9]*)必须换成(.[0-9]+)?
    • 尽管如此,它仍然匹配%d%%,例如。我不确定这是否正确。它根本就应该是两个单一的格式字符串。根据语法(参见 Wikipedia 链接),%% 也可以是有效的格式字符串。有人可以验证吗?第一个% 是前缀then,第二个% 是类型。如果这是有效的,那么上面的 RegEx 仍应将其视为两个单一格式字符串。
    • @MarcoW.,我不知道具体规则,但听起来最后一个捕获组中有一些东西依赖于早期组中的一些东西。要允许 % 仅在第一个 % 之前没有其他内容时,您可以这样做:%(([0-9]+\$)?)(?:([,+ (\-#0]*)([0-9]*)(\.[0-9]+)?((hh|h|l|ll|L|z|j|t)*)(d|i|u|f|F|e|E|g|G|x|X|o|s|S|c|C|a|A|b|B|h|H|p|n)|(%))
    猜你喜欢
    • 2014-06-19
    • 1970-01-01
    • 2023-04-08
    • 2012-05-12
    • 1970-01-01
    • 2020-10-06
    • 2017-06-07
    • 2022-08-02
    相关资源
    最近更新 更多