Golang Go语言中 (?m)<div id="ds_div">\n(.*</table>)</div> 与 (?m)<div id="ds_div">\n([\s\S]</table>)</div>
第一个行 第二个不行 有人知道原因吗
(?m)<div id="ds_div">\n(.*</table>)</div>
(?m)<div id="ds_div">\n([\s\S]</table>)</div>
package main
import ("regexp"
"fmt"
)
func main() {
s := `<div id="ds_div">
<table border="0" width="100%"><tbody></tbody></table></div>`
validId := regexp.MustCompile(`(?m).<div id="ds_div">\n([\s\S])</table></div>`)
ret2 := validId.FindStringSubmatch(s)
fmt.Printf("ret2:%v\nvalidId:%v\n", ret2, validId)
return
}
Golang Go语言中 (?m)
更多关于Golang Go语言中 (?m)<div id="ds_div">\n(.*</table>)</div> 与 (?m)<div id="ds_div">\n([\s\S]</table>)</div>的实战教程也可以访问 https://www.itying.com/category-94-b0.html
]*
更多关于Golang Go语言中 (?m)<div id="ds_div">\n(.*</table>)</div> 与 (?m)<div id="ds_div">\n([\s\S]</table>)</div>的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
哎呀 忙晕了
看起来是在爬取 html 里的信息,为什么不直接使用 html parser 之类的库去解析?
求求你们不要用正则解析 xml 了,用些解析库吧
https://github.com/avelino/awesome-go 这里一堆,你们慢慢挑
在Go语言中,正则表达式(Regular Expressions)是一个强大的工具,用于字符串匹配、查找和替换等操作。针对你提到的两个正则表达式,我们可以从匹配模式和效率上进行简要分析。
-
正则表达式解释:
-
(?m)<div id="ds_div">\n(.*?</table>)</div>
:(?m)
:多行模式(multiline mode),使得^
和$
分别匹配行的开始和结束,而不是整个字符串的开始和结束。(.*?</table>)
:非贪婪匹配(non-greedy match),尽可能少地匹配字符直到遇到</table>
。
-
(?m)<div id="ds_div">\n([\s\S]</table>)</div>
:([\s\S]</table>)
:使用[\s\S]
匹配任意字符(包括换行符),直到遇到</table>
。
-
-
差异与效率:
- 第一个表达式使用了非贪婪匹配,这通常更高效且更精确,因为它在找到第一个
</table>
时就停止匹配。 - 第二个表达式使用
[\s\S]
来匹配任意字符,包括换行符,这在匹配大文本块时可能会稍显低效,因为它会一直匹配到最后一个</table>
(如果存在多个),尽管在此特定上下文中,由于后面紧跟</table>
,实际上效果与第一个相同。
- 第一个表达式使用了非贪婪匹配,这通常更高效且更精确,因为它在找到第一个
总结:在大多数情况下,第一个表达式(非贪婪匹配)是更好的选择,因为它既准确又高效。