- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
有了 Regex 模式 regexPattern
,我如何确定与 regexPattern
匹配的最长字符串的长度。
虚构的 int LongestLength(string pattern)
应该像这样工作:
Assert.Equals(LongestLength("[abc]"), 1);
Assert.Equals(LongestLength("(a|b)c?"), 2);
Assert.Equals(LongestLength("d*"), int.MaxValue); // Or throws NoLongestLengthException
虽然题目是 C#,但 C# 和 JavaScript 的答案都很好。
最佳答案
这对于 proper regex 来说非常简单仅使用运算符 ?
、*
和 +
和 |
,加上括号、字符类,当然还有普通字符.事实上,即使是 \1
风格的反向引用(它不是正则表达式的正式定义的一部分,并且确实使一些关于正则表达式的问题复杂化)也可以毫无问题地处理。
正则表达式只是树结构的紧凑编码(类似于数学公式是描述算术的树结构的紧凑编码)。在每对相邻的字符之间有一个隐含的“跟随”运算符,它对应于一个有 2 个子节点的节点,一个是它左边的子正则表达式,另一个是正则表达式的整个其余部分;由 |
字符分隔的一系列子正则表达式对应于单个“alt”节点,其子节点的数量与备选方案的数量一样多(即,比 |
字符的数量多一个) ,而每个其他运算符只有一个 child (即它所操作的子正则表达式),而每个普通字符或字符类根本没有 child 。要计算最大长度匹配字符串,您可以对该树结构进行自下而上的遍历,在每个节点贪婪地分配将匹配该节点的最长字符串的长度,给定与其匹配的最长字符串的知识 children 。
确定与这棵树中任何给定节点匹配的最长字符串长度的规则是:
xy
): maxlen(x) + maxlen(y)a|b|...|z
): max(maxlen(a), maxlen(b), ...,最大长度(z))x?
): maxlen(x)x*
) 或 posrep(x) (x+
):无穷大[...]
):1\1
-style backreferences: 相应括号表达式的 maxlen一个结果是 *
或 +
出现在任何地方(除非转义或字符类的一部分,显然)将导致无限向上传播直到它击中根源。
Regex: abcd
"Function call syntax": follows(a, follows(b, follows(c, d)))
As a tree:
follows
/ \
a follows
/ \
b follows
/ \
c d
第二个例子:
Regex: (a|b|de)c?
"Function call" syntax: follows(alt(a, b, follows(d, e)), maybe(c))
As a tree:
follows
/ \
alt maybe
/ | \ \
a b follows c
/ \
d e
对于第二个正则表达式/树,自下而上的遍历将为叶节点 a、b、d、e 和 c 分配 maxlen 为 1;那么底部 follows() 节点的 maxlen 是 1 + 1 = 2;那么 alt() 节点的 maxlen 是 max(1, 1, 2) = 2;可能节点的 maxlen 为 1;最顶层的 follows() 节点的 maxlen,因此对于整个正则表达式,是 2 + 1 = 3。
如果您指的是允许其他 Perl 风格增强功能的正则表达式,它可能会变得更加复杂,因为局部最佳长度选择可能会导致全局次优选择。 (我原以为 Perl 风格的扩展甚至有可能使正则表达式图灵完备,这意味着通常不可能确定是否有 any 匹配的字符串——但 the discussion here 似乎表明情况并非如此,除非您当然允许 ?{...}
构造。)
关于javascript - 对于正则表达式模式,如何确定与模式匹配的最长字符串的长度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31172183/
我正在尝试编写一个名为 map-longest 的 Clojure 实用函数(感谢备用名称建议)。该函数将具有以下“签名”: (map-longest fun missing-value-seq c1
为什么我创建了一个重复的线程 我在阅读后创建了这个线程 Longest increasing subsequence with K exceptions allowed .我意识到提出问题的人并没有真
我正在编写一个 Sub 来识别 1 到 1000 之间最长的 Collatzs 序列。由于我刚刚开始学习 VBA,我想知道如何添加过程来计算每个序列的长度。 Sub Collatz() Dim i
我正在编写一个 Sub 来识别 1 到 1000 之间最长的 Collatzs 序列。由于我刚刚开始学习 VBA,我想知道如何添加过程来计算每个序列的长度。 Sub Collatz() Dim i
我正在尝试减去 CSV 中的两列以创建第三列“持续时间”结束时间 - 开始时间 每一行也对应一个用户 ID。 我可以创建一个仅包含“持续时间”列的 csv 文件,但我宁愿将其重定向回原始 csv。 例
我在 2018.04 玩这个最长的 token 匹配,但我认为最长的 token 不匹配: say 'aaaaaaaaa' ~~ m/ | a+? | a+ /; # 「a」
因此,按照规范规定最终用户/应用程序提供的给定变量(200 字节)的字节长度。 使用 python 字符串,字符串的最大字符长度是多少,满足 200 字节,因此我可以指定我的数据库字段的 max_le
我需要针对我们的Jenkins构建集群生成每周报告。报告之一是显示具有最长构建时间的作业列表。 我能想到的解决方案是解析每个从属服务器(也是主服务器)上的“构建历史”页面,对于作业的每个构建,都解析该
我正在构建一个 iOS 应用程序,它将流式传输最长为 15 秒的视频。我阅读了有关 HLS 的好文章,因此我一直在对片段大小为 5 秒的视频进行转码。如果视频的第一部分加载时间太长,那么我们可以在接下
docs for Perl 6 longest alternation in regexes punt to Synopsis 5记录 longest token matching 的规则.如果不同的
我是一名优秀的程序员,十分优秀!