当前位置: 首页 > 知识库问答 >
问题:

与正则表达式匹配的正则表达式

范文昌
2023-03-14

有没有人试图描述与正则表达式匹配的正则表达式?

由于重复的关键字,这个主题几乎不可能在网上找到。

它可能在实际应用程序中不可用,因为支持正则表达式的语言通常具有解析它们的方法,我们可以将其用于验证,以及一种在代码中分隔正则表达式的方法,可用于搜索目的。

但是我仍然想知道匹配所有正则表达式的正则表达式是什么样子的。应该可以写一个。

共有2个答案

娄利
2023-03-14

我只用了几分钟就写好了,所以不要期望太高...尽管如此,它仍然可以匹配字符串中的正则表达式

^([igsmx]{1,})?\/(?=.*?(\\w|\\d|\[.*?\]|\(.*?\))).*?\/([igsmx]{1,})?$

它可以扩展,一万英尺...

章阳波
2023-03-14

我没有正式的证明,但是我强烈怀疑正则表达式的语言本身不是正则表达式,因此不受正则表达式的约束。这将使得一个合适的正则表达式来表示它是不可能的。

为什么?好吧,可以证明需要平衡括号的语言,比如Lisp(或者更著名的HTML),使用泵引理是不规则的:

平衡(即适当嵌套)括号的语言不是正则的证明遵循相同的思想。给定p,有一个以多于p个左括号开头的平衡括号串,因此y将完全由左括号组成。通过重复y,我们可以生成一个不包含相同数量的左括号和右括号的字符串,因此它们无法平衡。

正则表达式允许嵌套捕获组,它们似乎属于这一类:

以上一课为例,如果我们想捕获图像文件编号和文件名,我可以编写表达式 ^(IMG(\d ))\.png$

无论如何,对于计算机科学堆栈交换站点来说,这可能是一个更好的问题。

编辑:

tomp指出,基于PCRE的正则表达式引擎(以及其他可能的引擎)实际上能够匹配所有上下文无关的语法和至少一些上下文相关的语法!这代表了表达能力的巨大差异。假设文章是正确的,相当酷!

(当然,这些扩展实现是否仍然是“正则表达式”还有待讨论。既然我们是在编程站点,我会采取他们的立场。在CS站点,我可能会采取相反的立场!)

因此,在技术上可以将正则表达式表示为正则表达式。

即便如此,编写代表所有正则表达式的正则表达式的任务也非常复杂。为了进行比较,请考虑验证电子邮件地址的任务。许多资源将其归结为类似于 [^@] @[^@] ,或者“只要只有一个 at 符号,并且之前至少有一个字符,之后至少有一个字符,我们就很好”。

但是看看这个明显完整的正则表达式来验证RFC 822。正确吗?谁知道呢。我当然不会去查。

看到这一点后,我不想尝试编写正则表达式来验证正则表达式。

 类似资料:
  • 我有一根线,比如: 如何匹配每行的最后一个?顺便说一句,这是我试图在Sublime的文本中做到的。这些值不一致,就像我在这里看到的,我有几百行要替换。 我尝试了,但这与相匹配。

  • 我们得到了一些这样的内容:

  • 主要内容:基本模式匹配,字符簇,确定重复出现基本模式匹配 一切从最基本的开始。模式,是正则表达式最基本的元素,它们是一组描述字符串特征的字符。模式可以很简单,由普通的字符串组成,也可以非常复杂,往往用特殊的字符表示一个范围内的字符、重复出现,或表示上下文。例如: 这个模式包含一个特殊的字符 ^,表示该模式只匹配那些以 once 开头的字符串。例如该模式与字符串 "once upon a time" 匹配,与 "There once was

  • 有没有一种方法可以在python中编写与以下格式的字符串匹配的正则表达式: 或 在这里,$=表示零或更多的空白可以存在 :来自字符串的固定子集的字符串['feat','fix','docs','断'] :最大长度为n的字符串 :最大长度为m的字符串 前缀应该始终是一个字符串,之后是一些最大q长度的字母数字字符 注意:我们不能省略像应该使用与下面示例中所示完全相同的格式: feat(feat new

  • 问题内容: 当字符串以数字开头时,我需要匹配,然后是一个点,然后是一个空格和1个或多个大写字符。匹配必须发生在字符串的开头。我有以下字符串。 我尝试过的正则表达式是: 它不匹配。一个有效的正则表达式将对这个问题有什么作用? 问题答案: (对不起,我先前的错误。大脑现在坚定地投入了。嗯,也许。) 这有效: 分解: =字符串开头 =一个或多个数字 (之所以转义,是因为它在字符串中,因此) =文字(或者

  • 问题内容: 我从以下格式的文件中获取输入: 现在,我想在我的Java代码中读取int1,int2,int3和int4。我该如何在Java中使用正则表达式匹配。谢谢。 问题答案: 为了避免空值: