繁体   English   中英

使用.NET正则表达式进行乘法运算

[英]Multiplication with .NET regular expressions

本着polygenelubricants努力用正则表达式做傻事的精神,我目前试图让.NET正则表达式引擎为我倍增。

当然,这没有实际价值,而是纯粹的理论练习。

到目前为止,我已经到了这个怪物,应该检查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>)*

从我所知道的,没有文字可以匹配,正则表达式拒绝匹配它不止一次。 我将正则表达式简化为以下内容:

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

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

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

通过12111222 因此,从""匹配""到匹配某事会导致正则表达式按预期工作。

回到你的原始正则表达式,我的猜测是(?<bc>)*仅匹配0-1次,这解释了为什么在你的字符串中有一个2工作,但有多个失败。

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

通过Joel的输入,我能够使其工作,稍微修改算法以避免那些(?<bc>)*行。

看吧:

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
            (?(b)               # if b > 0
                (                                       
                    (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
                )
                |                       # else ( b = 0 )
                (
                    (3(?<b-c>))*        # match 3's, decrementing c and incrementing b until
                                        # there are no 3's left or c is zero
                    (?(c)(?!))          # if c != 0, fail
                )
            )
        )
    )*      # repeat
(?(a)(?!))  # if a != 0, fail
$
", RegexOptions.IgnorePatternWhitespace);

我想给出一个ideone链接,但我得到的结果与我的不同。 也许是因为我使用的是.NET 4.0而他们没有?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM