胶带正则表达式决定器


11

您的任务是创建一个程序,该程序使用来自StackExchange网络上站点的代码段确定给定的字符串是否为有效的正则表达式。

为了解决这一挑战,将对正则表达式方言进行精简,并尽量减少其元字符集:()*?|\。因此,您将无法使用内置的正则表达式解析器。

  • \用于转义元字符。它后面必须跟一个元字符。
  • 未转义的括号必须保持平衡
  • *并且?必须在前面加上非元字符,带括号的组或转义的元字符。
  • 所有其他可打印的ASCII字符以及换行符,制表符和空格都必须支持为非元字符。未定义包含其他字符的字符串会发生什么。
  • 正则表达式的实际含义对于此挑战并不重要。

例子

Truthy:
  abc
  a?
  (a|)*
  ()
  a|b*
  \*
  \\
  \\*
  a*b?(cd|e)
  +
  [
  }
  (123\))*
  \|
  (a(b(c|d)*e)*f)*
  (|\)*)
  (abc)+*
  (abc)+
  +abc

^ last test case is an actual newline

Falsy:
  ?abc
  *
  **
  \
  (
  a*?
  a?*
  ?
  a)
  (\)
  (|\)*
  \()
  |*
  (?:abc)
  \\**
  \n

计分

您的总分是从StackExchange的问题和答案中摘录的片段数。

  • 重复的摘录数是使用次数的两倍。
  • 可以自由添加和删除空格(由于Python,Haskell和其他对空格敏感的语言),并且不计入代码段数。
    • 如果您的代码实际上是用Whitespace编写的,那就是例外。
  • 只要片段来自问题,答案和评论的时间早于此挑战(包括按编辑时间-如有必要,请使用较旧的修订版),就可以从任何StackExchange网站上获取片段。(2019年9月24日@ UTC 3:30)
  • 片段可以来自问题,答案或评论正文中的任何位置,无论它是否位于预格式化的代码块中。
  • 将一个代码段拼接到另一个代码段的中间会导致外部代码段计为两个代码段

最低分获胜!


1
@RobinRyder是的,已更改
Beefster

职位是否可以早于或等于此挑战,即我们可以使用此挑战正文中的摘要吗?
乔·金

1
“这样,您将无法使用内置的正则表达式解析器”是说它的目的是为了通过简单的“是/否”来阻止它使用,还是在我们的答案中完全禁止使用正则表达式?
user0721090601 '19

@guifa经过专门设计,因此您不仅可以使用您语言的正则表达式引擎,还可以查看它是否编译给定的正则表达式。我所知道的每种语言都支持更大的元字符集和专门的捕获组,因此它们在所有情况下都无法正确匹配这组字符。
Beefster

1
@ JL2210这将使其成为两个摘要:一个开始,一个结束。您可以使用单个代码段,只要它通过所有测试用例并且来自比此挑战要早的答案/问题/帖子
Beefster

Answers:


6

Perl 6、20个摘要

{$_ eq m/[[<-[()*?|\\]>|\\<[()*?|\\]>|'(' <~~>* ')']<[*?]>?|\|]+/}

在线尝试!

摘录摘自:

{$_ eqm/[<-[()*?|\\]>|\\<[()*?|\\]>|'(' <~~>* ')'<[*?]>?|\|]+/}

这主要是贪婪的方法(通过所有一两个字符片段变得明显)。我使用SymbolHound搜索单个字符,唯一真正的优化是摘要'(' <~~>* ')'摘录自我自己的答案对递归Perl 6正则表达式。

说明:

这基本上检查输入是否等于有效正则表达式的贪婪匹配。我们不能只使用正则表达式本身并添加^$标记末端的原因是因为我们使用的是递归正则表达式,如果有^$标记,它将无法正常工作。正则表达式本身是:

m/[                             ]+/   # Match one or more times
   [              ]  # Any of 
    <-[()*?|\\]> |     # Not a metacharacter
    \\<[()*?|\\]>      # A metacharacter preceded by a \
    '(' <~~>* ')'      # Brackets surrounding a valid regex
                   <[*?]>?  # Optionally followed by a ? or *
                           | \|    # Or just the | metacharacter

蒂尔~~,谢谢!
user0721090601

@guifa是的,我通过P6规范了解到这一点,其中有很多东西尚未得到适当记录。我怀疑~~它没有出现,因为它尚未完全实现(例如<~~0>),尽管其中还有其他隐藏的宝石。
乔·金
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.