基础 - 多行匹配

  • 作者:KK

  • 发表日期:2017.6.10


要点速读

  1. 其实平时的匹配是按行来匹配的,比如下图这样的情况,内容分成了2行,正常的正则模式匹配不了b到g之间的内容,必须钩选匹配新行,这样开启了多行匹配模式才可以


  2. 据我观察,无论是编辑器还是编程代码都是默认单行查找的

  3. 各种编程语言的多行匹配模式写法都不一样


JS代码

console.log('haha hi!\n what is your name?'.match( /hi.+your/ )); // null

console.log('haha hi!\n what is your name?'.match( /hi[\s\S]+?your/ )[0]); //匹配成功

虽然正则表达式中.号表示任意字符,但是它不能代表换行,所以第一个表达式hi.+your企图匹配两个词之间的所有内容一旦碰到\n就匹配失败了

要解决这个问题就要将.换成[\s\S]才能匹配包含换行的所有内容


PHP代码

解决办法和JS一样

preg_match('#hi.+your#', 'haha hi!' . PHP_EOL . ' what is your name?' . PHP_EOL . 'fghijk', $matchResult1);
preg_match('#hi[\s\S]+?your#', 'haha hi!' . PHP_EOL . ' what is your name?' . PHP_EOL . 'fghijk', $matchResult2);

header('Content-type:text/plain');
print_r([
	$matchResult1, // 空数组,失败
	$matchResult2[0], // hi!\n what is your
]);

JAVA的情况

据说JAVA正则的.号能匹配换行,于是就不需要特殊解决,只是据说,暂未考证