本着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)(?!))
同时通过 12
和 111222
.所以从 ""
的比赛开始与某些东西匹配会导致正则表达式按预期工作。
回到原来的正则表达式,我猜是 (?<b-c>)*
仅匹配 0-1 次,这解释了为什么在您的字符串中有一个 2 有效,但超过一个失败。
使用 11
的字符串也失败了,这遵循相同的逻辑,因为这使得整个匹配 ""
,这很可能意味着它只匹配一次,导致 (?(a)(?!))
失败。
关于c# - 与 .NET 正则表达式的乘法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3785635/