关闭标签!


13

这是基于先前删除的同名我的挑战

介绍

您的任务是编写一个程序,该程序根据输入是否正确地按正确的顺序打开和关闭其所有类似于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>

计分

这是,因此以字节为单位的最短代码获胜。照常禁止出现标准漏洞


1 注意:这不是真正的XML,而是具有不同挑战规则的伪XML。标签和属性名称与规范不同。


如果标签前后有多个空格,我们是否必须将其标记为false?
JayDepp '16

@JayDepp是的-让我在我的帖子中澄清一下
Andrew Li

我们可以使用将字符串解析为XML的内建函数吗?
奥利弗

@obarakon问题是这不一定是有效的XML。参见脚注。
李彦宏

它是正确的说,这是一个truthy输入< : : :><:/><: :=":=:" ::></:>< /:>
此处插入用户名,2016年

Answers:


2

视网膜76 74字节

+`< ?([-.:\w]+)( ?[-.:\w]+(="[^"]*")?)* ?(/>|>[^<>]*< ?/ ?\1 ?>)

^[^<>]*$

由于我已经看到视网膜确实适合打高尔夫球,所以我想尝试一下。遵循与我的Ruby回答相同的逻辑,并输出0或1。

在线尝试!


1
您不需要M`。如果最后阶段只有一个部分,则意味着匹配模式。
马丁·恩德

1

红宝石(2.3.1),103 101 100字节

->s{s.sub!(/< ?([-.:\w]+)( ?[-.:\w]+(="[^"]*")?)* ?(\/>|>[^<>]*< ?\/ ?\1 ?>)/,'')&&redo;!(s=~/<|>/)}

通过追加调用的匿名函数.call("<Apple></Apple>")。替换匹配标签或自闭合标签,直到没有标签为止,然后返回字符串是否没有尖括号。

在线尝试!


这标记<p title="This is a \"test\"."></p>为Falsey,但不应该如此。
orlp 2016年

@orlp'值可以在右双引号之前包含除“之外的任何内容。
JayDepp '16

哦,这不是真正的XML ...
orlp 2016年

1
真正的XML绝不应该用正则表达式来解析:)
JayDepp '16
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.