我们通过了挑战RegexPlay 100%

意大利的里雅斯特大学的机器学习实验室提出的挑战可以解决 12个问题,而且任务的级别也有很大不同-从超级容易到困难。


当然,可以有多个解决方案,问题中的测试用例并不能涵盖所有选项。 不过,如果您的分数达到100%,那么恭喜您! 测试通过。


破坏者:在某些任务(尤其是轻任务)中,提示实际上是一种解决方案。


任务1-查找数字


有包含数字的文本,您需要查找所有数字。


难度:超级容易。


提示

您需要使用数字字符和乘数符。


解决方案
\ d +

“ [0-9] +”也是正确的决定。


解析解决方案
  • “ \ d”或“ [0-9]”-0到9之间的任何单个字符。
  • “ +”-允许一个或多个字符。

任务2-查找mac地址


有包含mac地址的文本,您需要找到它们。


难度:容易。


提示

您需要使用一个字符,该字符表示字母或数字中的任何字符,要分隔的冒号和乘数符。


解决方案
\ w {2}:\ w {2}:\ w {2}:\ w {2}:\ w {2}:\ w {2}

尽管不是完全准确,但用“ +”代替“ {2}”也是正确的决定。


解析解决方案
  • “ \ w”是字母或数字中的任何字符。
  • “ {2}”-只能使用2个字符。

最佳解决方案

那些熟悉mac地址的人已经注意到,mac地址是用十六进制表示的。 在以前的解决方案中,使用\ w符号,这表示字母的任何字符和所有数字。 我同意,可能这是不必要的,但是您可以考虑到这一点,同时减少规则性。


([\ da-f] {2} :) {5} [\ da-f] {2}

解析解决方案
  • “ \ d”是任何一位数字,“ af”是从a到f的范围。 总共,我们有一个有效的字符集0123456789abcdef-即十六进制代码Hex。 “ {2}”-此字符集中的任意2个字符。
  • “([[\ da-f] {2} :)” {5}-重复两个字符十六进制+冒号正好允许5次。
  • 并在“ [\ da-f] {2}”的末尾-十六进制集中的任意2个字符

任务3-查找ftp地址


有带有ftp地址的文本,您需要找到它们。


难度:容易。


提示

您需要以ftp:/开头,然后在地址中列出有效字符,不要忘了乘数符。


解决方案
ftp:\ / \ / [\ w \ d -_。\ /] +

解析解决方案
  • “ \ /”-正常转义字符“ /”。
  • 方括号内是有效字符的枚举,即字母中的任何字符或数字,连字符,下划线,句号或斜杠(如果名称中还有其他字符,则可以添加它们)。

任务4-查找模板


有某种格式的文件,您需要在其中找到与模式$任何字符$匹配的所有行。


难度:容易。


提示

您需要使用转义保留字符,任何字符的字符,多重量词和惰性字符。


解决方案

一项平常的任务,但它需要对常客有更好的了解。


\\ $。+?\\ $

解析解决方案
  • “ \\ $”是美元筛选。
  • “。+”-任意数量的任何字符,“?” -消除贪婪。

任务5-查找IP地址


从文本中找到IP地址。


难度:容易。


提示

与第二项任务非常相似。


解决方案
\ d + \。\ d + \。\ d + \。\ d +

如果您写的是“ {1,3}”而不是“ +”,那么您就完成了。


解析解决方案
  • “ \ d”是任何一位数字,
  • “ +”-任意数量的字符,“ {1,3}”-严格限制字符数(从1到3)。

最佳解决方案

IP地址不仅是数字,而且是0到255之间的数字。


\ b((\ d | [1-9] \ d | 1 \ d {2} | 2 [0-4] \ d | 25 [0-5])\。){3}(\ d | [1 -9] \ d | 1 \ d {2} | 2 [0-4] \ d | 25 [0-5])\ b

解析解决方案

要确定从0到255的范围,您将不得不尝试一下:


  • “ \ d”是从0到9的数字
  • “ [1-9] \ d”-从10到99的数字
  • “ 1 \ d {2}”-从100到199的数字
  • “ 2 [0-4] \ d”-200到249之间的数字
  • “ 25 [0-5]”-chilso从250到255

接下来,我们允许从0到255的数字模式重复3次:


  • “((\ d | [1-9] \ d | 1 \ d {2} | 2 [0-4] \ d | 25 [0-5])。){3}”-点内,因为它也重复3次,最后以相同的数字范围,但不带点。
  • 在结尾处和开头,我们添加单词“ \ b”的边框符号-需要从条目中删除此类文本“ 1172.30.42.109”(我同意,这不太可能,而且可能是不必要的)。

任务6-锚点


从html文档中提取href标签。


难度:中等。


提示

每个括号都使用“除”和“或”以外的任何字符。


解决方案
href =(“ [^”] +“ |'[^'] +')

解析解决方案
  • “-用双引号开始搜索。
  • “ [^”] +“-绝对是除双引号外的任何字符。
  • 我们以双引号结尾。

我们将所有这些放在括号中,并在符号后加上-或“ |” 并重复相同的单引号。


任务7-链接


在任何文本中找到所有链接。 仅查找链接还不够,因此您需要完成任务,因此您需要从末尾扔掉无效字符。


困难:困难。


提示

您需要以http开头,使用“除以外的任何字符”,并以有效的字符结束搜索。


解决方案
http:\ / \ /([^> \ s] +)[\ w \ /]

任务中没有https链接,但是您可以通过添加“ s”来考虑。 在http之后。


解析解决方案
  • “ [^> \ s] +”查找除“>”字符和空格字符以外的所有字符。 实际上,您可以这样阅读:“我们继续前进,直到看到其中一个符号。”
  • “ [\ w \ /]”是一个分隔符,它允许链接仅以拉丁字符或斜杠结尾。

结果-我们以http://开头,然后绝对是除字符“ <”或空格之外的任何字符,但最后需要拉丁字符或斜杠。


  • 额外的“ s”? 在“ https?”中 只允许同时使用“ http://”和“ https://”。

任务8-标头


在HTML中,标头是任何h +数字标记。


难度:中等。


提示

以h +数字+任何字符或不存在的字符开头。


解决方案

很简单:


<h \ d。*>。* <\ / h \ d。*>

解析解决方案
  • “ h \ d”-在这里我们说,字符必须必须在“ \ d”之后。
  • 然后,“。*”可以输入任意数量的字符,或者什么也不能输入。

最佳解决方案

在h后面有一个数字,并且html规范指出从1到6的数字是有效的,并且标签本身不能用除方括号以外的其他任何东西关闭。 因此,此解决方案将更加准确:


<h [1-6] [^>] *>。+?<\ / h [1-6]>

的确,有一个错误允许您使用一个数字打开标签,然后关闭另一个数字。 因此,更准确的解决方案是使用链接:“ <h([1-6])[^>] *>。+?<\ / H \ 1>”。 这并不是说测试不区分大小写。


解析解决方案
  • “ h [1-6]”-在这里我们说在“ h”之后,数字必须从1到6。
  • “ [^>] *”-“>”以外的任何字符都可以继续,也可以不继续。

另外,关于添加:


  • 将表达式“(h [1-6])”括在方括号中,可以在数字1处创建一个组。
  • 此外,使用到第一组“ \ 1”的链接,我们讨论了我们希望在同一行末h看到的内容,该行具有与开头相同的数字。

任务9-电话


在所有手机中以不同格式显示的自由文本。


困难:困难。


提示

必须使用符号的存在或不存在的符号,用于限制位数的量词以及字符集的构造。 可能的设计或。


解决方案
\(?\ d {3} [\)。 \ /-] {1,2} \ d {3} [-。] \ D {4}

它可以工作,但是在前三位数字之后允许两个字符-如果它是一个右括号并在其后有一个空格,则很好,但如果有两个连字符,则不好。 因此,有一个稍微准确的解决方案:“ \(?\ D {3}(\)?| [。\ /-])\ d {3} [-。] \ D {4}”


解析解决方案
  • “ \(?”-我们指出存在符号“(”或不存在符号的可能性,我们将其屏蔽,因为它是保留符号。
  • “ \ d {3}”-仅限于3的数字。
  • 其他字符“ [\)。\ /-] {1,2}”是可能的-斜杠,右括号,句点,空格,反斜杠和连字符。 {1,2}-表示这些字符可以是1或2。例如,右括号和其后的空格。
  • 进一步必须为“ [-。]”-连字符或句号。
  • “ \ d {4}”是末尾的四位数字。

任务10-作者


有一个包含元素的特定模式,可从作者字段中查找所有作者。


难度:非常困难。


提示

必须依靠这样一个事实,即所有作者的姓名都以大写字母开头并以某种模式书写。


解决方案
[AZ] [A-Za-z-'] +,[AZ](\ {\\“ \ w \})?[A-za-z-'] *([AZ] [A-Za-z- '] *)?

这个解决方案是正确的,但是有一个缺点。 我们带着拐杖({\“ \ w})走过” {\“ u}吗?” 如果您也将此拐杖放在作者姓名的其他位置,则基本上是可行的。


无论如何,如果您能够以某种方式解决此问题,那就太好了!


解析解决方案
  • “ [AZ] [A-Za-z-'] +”-我们正在寻找一个单词,该单词必须以大写字母开头,然后包含任何字母,连字符或撇号。
  • 此外,所有内容都稍稍高一点,但是在这两者之间有“({{\“ \ w})?”-只是拐杖,您可以绕过屏蔽。这意味着可以存在“ {\“ u}”缺席。
  • 然后,再次与第一种情况“([[AZ] [A-Za-z-'] *)?]”完全相同,但要注意的是,此表达式包装在一个组中,并且有一个“?” 表示不约束此条件。

此处的PS [A-Za-z]枚举是一项必要的措施,因为测试中没有修饰符。


最佳解决方案

有一个更紧凑,更简单的解决方案,可以让您放弃上面的拐杖:


[AZ] \ S +,[AZ] \ S *([AZ] [\ S] *)?B

解析解决方案
  • “ [AZ] \ S +”“-首先,必须是大写字母” [AZ]“,然后是任意数量的非空白字符” \ S +“到分号”,“。
  • 此外,几乎相同的“ [AZ] \ S *”-开头必须以大写字母开头,然后是单词“ \ b”边界处的任何非空白字符。
  • “([[AZ] [\ S] *)? -并且它们之间是相同的,但不是强制性的中间名。

任务11-标头内容


就像在任务8中一样,但是您不需要查找标头本身,而是查找其内容。


困难:困难。


提示

该任务与8任务相同。 如果您知道来回查找,这并不困难。 有一个可以回顾而无需回顾的解决方案。


解决方案

不回头:


([\ w] * <[^ h]。+ | [^ <>] +)(?= <\ / h \ d>)

解析解决方案
  • “(([\ w] * <[^ h]。+ | [^ <>] +)”-关于头内容的开始方式,有两个选项。 第一个是在“ [\ w] * <[^ h]。+”内的标记-同时,您需要确保它不是h标记,并考虑到该标记之前可能有文本。 第二个选项是不带标签“ [^ <>] +”的文本,即除打开和关闭标签外的任何字符。
  • “(?= <\ / h \ d>)”-向前看,其中应该有一个结束标记h。

回顾:


(?<= <h [^>] +>)。+?(?= <\ / h \ d>)

另外,您可以考虑对问题8的所有评论。


解析解决方案
  • “(?<= <h [^>] +>)”-往回看里面应该是标签h。
  • “(?= <\ / h \ d>)”-向前看,其中应该有一个结束标记h。

任务12-作者列表


该任务类似于第十个任务,但我认为比较容易。


困难:困难。


提示

这是10个任务的所有基本原理,但是您需要考虑这一行的开始。 我知道的解决方案使用回头看。


解决方案
(?<= ^ \ d + \。)[AZ] [\ w] +,[AZ] [\ w \。] +

解析解决方案
  • “(?<= ^ \ d +。)”-回顾到您必须在任意点到新行之间留有任意数字的位置。
  • “ [[AZ] [\ w。] +””-从大写字母到分号再加上一个相同的“ [AZ] [\ w。] +”。

或者简单地说,这是:


(?<= ^ \ d + \。)[^,] +,[^,:] +

解析解决方案
  • “(?<= ^ \ d +。)”-回顾到您必须在任意点到新行之间留有任意数字的位置。
  • “ [^,] +,”-逗号中任意数量的任意字符+逗号。
  • “ [^,:] +”-逗号或冒号前的任意数量的任何字符。

Source: https://habr.com/ru/post/zh-CN472110/


All Articles