正则表达式高级应用之解二元方程式

代码如下:

/**

 * 计算 Ax+By=C

 */

function suan($A, $B, $C) {

 $A–;

 $B–;

 $str = str_repeat(‘-‘, $C);

 $search = ‘/^(.*)1{‘ . $A . ‘}(.*)2{‘ . $B . ‘}$/’;

 preg_match($search, $str, $r);

 return array(‘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 . ‘

‘;

echo ‘x=’ . ($r[x]) . ‘

‘;

echo ‘y=’ . ($r[y]);

// 输出

// 计算2x+3y=9

// x=3

// y=1

?>

我解释下

来一个简单的式子来说:2x+3y=9

原理:

在此函数中生成出这样的正则

代码如下:

^(.*)1{1}(.*)2{2}$

去匹配一个长度为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

转载请注明:代码学堂>编程开发 > 正则学习 > 正则表达式高级应用之解二元方程式

1. 本站所有资源来源于用户上传和网络,因此不包含技术服务请大家谅解!如有侵权请邮件联系客服!10210454@qq.com
2. 本站不保证所提供所有下载的资源的准确性、安全性和完整性,资源仅供下载学习之用!如有链接无法下载、失效或广告,请联系客服处理,有奖励!
3. 您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容资源!如用于商业或者非法用途,与本站无关,一切后果请用户自负!
4. 如果您也有好的资源或教程,您可以投稿发布,成功分享后有RB奖励和额外RMB收入!

磊宇堂正在使用的服务器 维护管理由磊宇云服务器提供支持

磊宇堂 » 正则表达式高级应用之解二元方程式

提供最优质的资源集合

立即查看 了解详情