反转Format方法。
大多数语言都提供Format
String类的方法(或等价的方法,例如sprintf
)。它基本上采用“格式”字符串,其中可能包含具有某些额外格式的占位符,并且要插入零个或多个值来代替这些占位符。
您的任务是以您选择的语言实现逆函数。
API
方法名称应为format1
或deformat
。
输入:第一个参数将是“格式”字符串,就像在原始格式方法中一样。第二个参数将是解析的字符串(请参见下面的示例)。不需要也不允许其他参数。
输出:格式的占位符对应提取的值的数组(或您的选择语言的等价形式)。
该占位符{0}
,{1}
,{2}
,等。
如果格式不正确,则可能会引发错误,或者返回任何您喜欢的格式。
在输入无效的情况下,您可能会抛出错误或返回任何您喜欢的内容。无效的输入是String.Format无法使用相同格式的字符串生成的,例如:'{0}{0}', 'AAB'
。
例子
deformat('{0} {1}', 'hello world') => ['hello', 'world']
deformat('http{0}://', 'https://') => ['s']
deformat('http{0}://', 'http://') => [''] // array of one item which is an empty string
deformat('{0}{1}{0}', 'ABBA') => ['A', 'BB']
歧义性
如有歧义,您可以返回任何合适的答案。例如:
deformat('{0} {1}', 'Edsger W. Dijkstra')
// both ['Edsger', 'W. Dijkstra'] and ['Edsger W.', 'Dijkstra'] are applicable.
更多规则
- 为了简化操作,实际上不需要支持格式化。您可能会忘记所有有关前导零,小数点或舍入问题的信息。只需将值生成为字符串即可。
- 为了使其平凡,不允许使用正则表达式。
- 您无需注意输入中的花括号(即,第二个输入参数将不包含任何
{
s或}
s)。
获奖
['', 'AAAA']
,['A', 'AA']
,['AA', '']
deformat('{0}{1}{0}', 'ABBA') => ['', 'ABBA']
吗?如果是这样,那么有一个便宜的解决方案,除非每个字符串至少出现两次。
deformat('{0}_{1}_{0}', 'A_BB_A')
吗?
deformat('{0}{1}{0}', 'ABBA') => ['A', 'BB']
,如果我们被给了deformat('{0}{1}{0}', 'AAAA')
怎么办?