c# - 与 .NET 正则表达式的乘法

标签 c# .net regex theory

本着polygenelubricants的精神' 努力用正则表达式做傻事, 我目前正在尝试让 .NET 正则表达式引擎为我进行乘法运算。

当然,这没有实际值(value),只能作为纯理论练习。

到目前为止,我已经遇到了这个怪物,它应该检查字符串中 1 的数量乘以 2 的数量是否等于 3 的数量。

Regex regex = new Regex(
@"
^
(1(?<a>))*  # increment a for each 1
(2(?<b>))*  # increment b for each 2
    (?(a)   # if a > 0
        (                   
            (?<-a>)             # decrement a
            (3(?<c-b>))*        # match 3's, decrementing b and incrementing c until
                                # there are no 3's left or b is zero
            (?(b)(?!))          # if b != 0, fail
            (?<b-c>)*           # b = c, c = 0
        )
    )*      # repeat
(?(a)(?!))  # if a != 0, fail
(?(c)(?!))  # if c != 0, fail
$
", RegexOptions.IgnorePatternWhitespace);

不幸的是,它不起作用,我不知道为什么。我评论它是为了向您展示我认为引擎应该做什么,但我可能会离开这里。 输出示例:

regex.IsMatch("123") // true, correct
regex.IsMatch("22") // true, correct
regex.IsMatch("12233") // false, incorrect
regex.IsMatch("11233"); // true, correct

欢迎任何想法!

最佳答案

我很确定问题出在这一行:

(?<b-c>)*

据我所知,由于其中没有可匹配的文本,Regex 拒绝匹配它不止一次。 我将正则表达式精简为以下内容:

(1(?<a>))*
(?(a)(?<-a>))*
(?(a)(?!))

传递给1但在 111 上失败.也试过(?<-a>)* .没有不同。但是,将其更改为

(1(?<a>))*
(?(a)((?<-a>)(2(?<b>))(?<-b>)))*
(?(a)(?!))

同时通过 12111222 .所以从 "" 的比赛开始与某些东西匹配会导致正则表达式按预期工作。

回到原来的正则表达式,我猜是 (?<b-c>)*仅匹配 0-1 次,这解释了为什么在您的字符串中有一个 2 有效,但超过一个失败。

使用 11 的字符串也失败了,这遵循相同的逻辑,因为这使得整个匹配 "" ,这很可能意味着它只匹配一次,导致 (?(a)(?!))失败。

关于c# - 与 .NET 正则表达式的乘法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3785635/

相关文章:

javascript - 如何将双/多斜杠替换为 url 中的单斜杠

c# - 我可以只输出数据表中值的第一个实例吗?

c# - NHibernate DuplicateMappingException 当两个类具有相同的名称但不同的命名空间时

正则表达式删除最后一部分

python - Lucene 或 Python : Select both "Hilary Clinton" and "Clinton, Hilary" name entries

c# - .Net POCO 的线程安全吗?

c# - 在类中映射相同对象类型的属性会调用 Equals 和 GetHashCode

c# - 以编程方式创建图像并将其作为字节 [] 数据从 Web 服务检索为媒体项存储在 Umbraco 中

c# - 加载此程序集会产生与其他实例不同的授权集

c# - 为多个项目指定代码分析输出文件