PHP的正则匹配

在PHP中是支持全局匹配的、匹配起来非常简单

<?php
$code='public class HelloWor{\\n    public static void main(String []args) {\\n       System.out.println("Hello World");\\n    }\\n}\\npublic class HelloWord{\\n    public static void main(String []args) {\\n       System.out.println("Hello World");\\n    }\\n}';
// var reg=new RegExp("^public\\s+class\\s+(.*?)(\\s+\\n|\\n)?{");
$myArr=preg_match_all("/public\\s+class\\s+(.*?)(\\s+\\n|\\n)?{/i",$code,$arr);


var_dump($arr);


?>

打印出来是正常的

请输入图片描述

用javascript正则就不行。

javascript匹配


var code='public class HelloWord {\\n    public static void main(String []args) {\\n       System.out.println("Hello World");\\n    }\\n}\\npublic class HelloWord\n{\\n    public static void main(String []args) {\\n       System.out.println("Hello World");\\n    }\\n}';
// var reg=new RegExp("^public\\s+class\\s+(.*?)(\\s+\\n|\\n)?{");
var myArr=(new RegExp("public\\s+class\\s+(.*?)(\\s+\\n|\\n)?{",'gi')).exec(code);
console.log(myArr);

//0: "public class HelloWord {"
//1: "HelloWord "
//2: undefined

//结果就匹配到了一个

用String对象的match方法解决

var codeArr=code.match(/public\s+class\s+(.*?)(\s+\n|\n)?{/gi);
console.log(codeArr);

//(2) ["public class HelloWord {", "public class HelloWord↵{"]
//0: "public class HelloWord {"
//1: "public class HelloWord↵{"

//完美解决

为什么会出现这个问题

定义和用法
lastIndex 属性用于规定下次匹配的起始位置。
语法
Js代码
RegExpObject.lastIndex
说明
该属性存放一个整数,它声明的是上一次匹配文本之后的第一个字符的位置。
上次匹配的结果是由方法 RegExp.exec() 和 RegExp.test() 找到的,它们都以 lastIndex 属性所指的位置作为下次检索的起始点。这样,就可以通过反复调用这两个方法来遍历一个字符串中的所有匹配文本。
该属性是可读可写的。只要目标字符串的下一次搜索开始,就可以对它进行设置。当方法 exec() 或 test() 再也找不到可以匹配的文本时,它们会自动把 lastIndex 属性重置为 0。
提示和注释
重要事项:不具有标志 g 和不表示全局模式的 RegExp 对象不能使用 lastIndex 属性。
提示:如果在成功地匹配了某个字符串之后就开始检索另一个新的字符串,需要手动地把这个属性设置为 0。

具体和鸟哥文章类似:https://www.laruence.com/2009/08/09/1036.html

Last modification:November 5, 2020
如果觉得我的文章对你有用,请随意赞赏