node.js - nodejs 正则换行的问题

查看:781
本文介绍了node.js - nodejs 正则换行的问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

这是我的正则。

\<body\>([\s\S].*?)\<\/body\>

str是我要查找的字符串。假如我去掉字符串里面的换行,正则可以匹配到东西,但是如果不加这个代码,正则就匹配不到。

str = str.replace(/\n/g, "");

谁能解释一下?如何解决这个问题?

----------补充-----------

后来换成

\<body\>([\s\S]*?)\<\/body\>

这样就行了。
.*?和*?的区别在哪呢?

解决方案

理解你是想取 body 标签中的所有内容

下面的正则表达式

/\<body\>([\s\S].*?)\<\/body\>/

之所以不能正确匹配是因为写错了。

分解一下这个表达式的关键部分

([\s\S].*?)

[\s\S] 匹配一个空白符或非空白字符,换句话说能匹配所有字符,包括换行、空格和跳格,但只能匹配一个

.*? 是什么意思呢?

. 表示匹配换行符以外的任意一个字符

.* 表示匹配0或多个任意字符(不包括换行符),总是尽可能匹配更多的字符。

这里 ? 是用来修饰 * 的,加在一起 *? 表示懒惰匹配,什么意思呢?就是尽可能少的匹配字符。0个或多个里面哪个最少呢?当然是0个,所以 .*? 匹配不到任何内容。

整个表达式

<body>([\s\S].*?)<\/body>  // 注意 < 和 > 是不需要转义的

匹配的内容是 <body></body> 之间只包含任意一个字符或空白符。和

<body>([\s\S])<\/body>

匹配的内容是一样的,也就是说 .*? 没有起到任何作用。

为什么去掉 . 就可以呢?因为去掉 . 以后 *? 的懒惰匹配用来修饰

[\s\S]

部分了,表示0或多个空白或非空白符。

我觉得你是把

[\s\S] 

理解为是用来匹配换行符的,再加上 . 就可以匹配所有内容了。其实按你的理解应该这样写

<body>([\s\S.]*?)<\/body>

这样也是能匹配上的,但这里的 . 是多余的,因为

[\s\S] 

匹配的是任何内容,包含了 . 匹配的内容。

所以 最终答案

<body>([\s\S]*?)<\/body>

匹配的内容是 <body></body> 之间0或多个任意字符。所以能正确匹配内容。

就是这样。

PS:排版有点乱,因为转义符在 SegmentFault 的编辑器很难用

这篇关于node.js - nodejs 正则换行的问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆