正则表达式解二元方程式代码
2023-06-13 09:14:36 时间
原文:http://blog.stevenlevithan.com/archives/algebra-with-regexes
我照着原文写出的正则还真的计算出了结果。上php例子:
<?php
/**
*计算Ax+By=C
*/
functionsuan($A,$B,$C){
$A--;
$B--;
$str=str_repeat("-",$C);
$search="/^(.*)\1{".$A."}(.*)\2{".$B."}$/";
preg_match($search,$str,$r);
returnarray("x"=>strlen($r[1]),"y"=>strlen($r[2]));
}
$A=2;
$B=3;
$C=9;
$r=suan($A,$B,$C);
//测试
echo"计算".$A."x+".$B."y=".$C."<br/>";
echo"x=".($r[x])."<br/>";
echo"y=".($r[y]);
//输出
//计算2x+3y=9
//x=3
//y=1
?>
我解释下
来一个简单的式子来说:2x+3y=9
原理:
在此函数中生成出这样的正则
去匹配一个长度为9的重复字符串“-”,匹配出两个分组的长度,就是他的x 和 y的值了
正则解释:
【(.*)】也就是0到无数个【.】点号。
\1就是引用一组。后面【{1}】就是重复1次。
后半是\2就是引用2组。后面【{2}】就是重复1次。
以下是那个英文博客的翻译:
二元方程17x+12y=51,其表达式【^(.*)\1{16}(.*)\2{11}$】。很好理解。【(.*)】也就是0到无数个【.】点号。(这里是接着上文说的,其实,【.】点号想表示的是字符“1”)
也就是0到无数个1,后面【\1】引用一次。后面【{16}】就是16次。作用于前面的【\1】,也就是16次引用。加上开始的【(.*)】一共正好17次。后面一个就不说了,跟这个一样。
正则引擎会依次尝试【(.*)】中0到无数个字符“1”,0个字符“1”,1个字符“1”,2个字符“1”一直增加的尝试。直到成功,否则要尝试完所有字符“1”的最大个数(这里是51个字符“1”)。
PS:没有考虑无解的情况,当无解时x和y都是0
相关文章
- 12 Python正则表达式
- 数据提取-正则表达式
- js正则表达式转义字符-【JavaScript正则表达式RegExp】
- Java经典实例:正则表达式,找到匹配的文本详解编程语言
- 固定电话正则表达式详解编程语言
- 使用MSSQL正则表达式匹配数字的技巧(mssql正则匹配数字)
- 用正则表达式格式化html标签的代码
- JavaScript正则表达式之后向引用实例代码
- 用正则表达式来判断素数的代码
- 使用正则表达式替换表情符号核心代码
- PHPIPV6正则表达式验证代码
- 正则表达式号码靓号类型判断代码
- JS点击图片改变图片图径并用正则表达式取图片名的代码
- asp.net正则表达式删除指定的HTML标签的代码
- 正则表达式匹配中文与双字节的代码
- js用正则表达式控制价格输入实现代码
- 通过Java正则表达式去掉SQL代码中回车换行和多余空格
- PHP正则表达式之正则处理函数小结(preg_match,preg_match_all,preg_replace,preg_split)
- 一个perl扩展正则表达式代码分析
- js正则表达式验证a/b/c格式的类型数据
- 如何实现正则表达式的JavaScript的代码高亮
- node.js正则表达式获取网页中所有链接的代码实例