这是我的正则。
\<body\>([\s\S].*?)\<\/body\>
str是我要查找的字符串。假如我去掉字符串里面的换行,正则可以匹配到东西,但是如果不加这个代码,正则就匹配不到。
str = str.replace(/\n/g, "");
谁能解释一下?如何解决这个问题?
----------补充-----------
后来换成
\<body\>([\s\S]*?)\<\/body\>
这样就行了。
.*?和*?的区别在哪呢?
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
理解你是想取 body 标签中的所有内容
下面的正则表达式
之所以不能正确匹配是因为写错了。
分解一下这个表达式的关键部分
[\s\S] 匹配一个空白符或非空白字符,换句话说能匹配所有字符,包括换行、空格和跳格,但只能匹配一个
.*? 是什么意思呢?
. 表示匹配换行符以外的任意一个字符
.* 表示匹配0或多个任意字符(不包括换行符),总是尽可能匹配更多的字符。
这里 ? 是用来修饰
*的,加在一起*?表示懒惰匹配,什么意思呢?就是尽可能少的匹配字符。0个或多个里面哪个最少呢?当然是0个,所以.*?匹配不到任何内容。整个表达式
匹配的内容是
<body>和</body>之间只包含任意一个字符或空白符。和匹配的内容是一样的,也就是说
.*?没有起到任何作用。为什么去掉
.就可以呢?因为去掉.以后*?的懒惰匹配用来修饰部分了,表示0或多个空白或非空白符。
我觉得你是把
理解为是用来匹配换行符的,再加上
.就可以匹配所有内容了。其实按你的理解应该这样写这样也是能匹配上的,但这里的
.是多余的,因为匹配的是任何内容,包含了
.匹配的内容。所以 最终答案 是
匹配的内容是
<body>和</body>之间0或多个任意字符。所以能正确匹配内容。就是这样。
PS:排版有点乱,因为转义符在 SegmentFault 的编辑器很难用