这是基于先前删除的同名我的挑战
介绍
您的任务是编写一个程序,该程序根据输入是否正确地按正确的顺序打开和关闭其所有类似于XML的1标签来返回真或假值。考虑以下内容作为输入:
<Apple>
因为标签未正确关闭,这将返回falsey值。这个:
<Apple></Apple>
相反,返回正确值,因为它已正确关闭。该程序还应该检查嵌套标签,以确保它们位于正确的位置。例如,将此作为输入:
<mango><Apple></mango></Apple>
所有标签均已正确关闭,但顺序不正确。您的程序必须检查正确的标记层次结构和嵌套。
定义
在我进入规则和假设之前,请先定义一些内容。
标签
基本的XML样式标签。例如:<Apple>
。它们最多可以有一个前导和尾随空格(否则它是无效的和虚假的),因此< Apple >
和<Apple>
是相同的。这些标签也可以包含类似的属性foo="bar"
(需要用双引号,否则无效,falsey) ,属性名只能包含任何字母数字字符或_
,:
,-
,和.
。属性名称也不需要属性值,并且值可以包含除"
右双引号之前的任何内容。结束标签不得包含属性,并且标签中不得包含换行符。
标签名称
标签名称是标签的名称。例如,<Apple>
的标签名称是Apple
。标记名称可以包含与属性名称相同的字符,并且区分大小写。这意味着,<Apple>
是不是 <apple>
。
自闭合标签
会自行关闭的常规标记,例如<Apple />
或<Apple/>
(它们相同)。斜杠和标签名称之间的空格是允许的。
纯文本
一个字符串,可以包含任何内容,并且不包含在<
和中>
。
“简单”标签
打开,关闭或自动关闭标签。
规则
- 输出可以退回或打印,并且输入可以按照您喜欢的任何方式进行
- 输入是一个字符串,由标签,纯文本或两者组成
您的程序可以是一个功能或整个工作程序
纯文本可以在任何地方;如果输入仅包含纯文本,则程序应返回真实值。
该程序需要识别嵌套标签。如果标签嵌套在标签中,则该嵌套标签必须在关闭父级之前关闭,就像常规XML一样,否则应返回falsey值
假设条件
- 您可以假设输入将始终是一个或多个“简单”标签
- 您可以假设输入将始终遵循上面定义的标签的格式
测试用例
虚假
<apple>
<apple></Apple>
<apple></mango>
<apple><mango>
<a><b></a></b>
Text<ul><li></li><ul />
<pear attr=foo></pear attr=foo>
<Ketchup flavor=spicy></Ketchup>
<Ap ple></Apple>
特鲁西
Text
<Apple />
<Apple></Apple>
< Apple ></ Apple>
<mango><Apple/></mango>
<mango>Text<div class="bar">More text \o/</div></mango>
<food group="fruit">Fruits:<orange :fruit-variety="clementine" /><pear _fruit.type="asian" /></food>
<example foo="abcdefghijklmnopqrstuvwxyz1234567890-/:;()$&@.,?!'" noValue>Any characters allowed! (0.0)</example>
计分
这是code-golf,因此以字节为单位的最短代码获胜。照常禁止出现标准漏洞。
1 注意:这不是真正的XML,而是具有不同挑战规则的伪XML。标签和属性名称与规范不同。
< : : :><:/><: :=":=:" ::></:>< /:>
?