当前位置: 首页 > 知识库问答 >
问题:

go的正则匹配换行和js不一样吗?

茅高卓
2023-10-25
tetsdfdsf## Contents- [test](#test)  - [Contents](#contents)  - [test2](#test2)  - [fdf and dfdf](#dfdf-and-dffd)  - [dfdf](#dfdf)  - [dfdf Building](#dfdf-building)  - [Build dfdf](#build-dfdf)  - [dfdf Line](#df-dfd)    - [dfd dfdf dfd](#advanced-console-dfd)    - [dfdf dfdf](#standard-cli)  - [dfdf](#configuration)  - [Continuous Integration](#continuous-integration)  - [dddd Preprocessors](#dddd-preprocessors)**[⬆ back to top](#contents)**

上面这段文本,我用这个正则Contents\n\n(.|\n)+?\n\n匹配中间的内容。

用网页版的在线正则测试是可以匹配出来中间的结果的,用go正则结果却是空的,什么问题?

var matchMenu = regexp.MustCompile(`Contents\n\n(.|\n)+?\n\n`)menuData := matchMenu.FindSubmatch(getContent())slog.Info(fmt.Sprintf("%#v", menuData))

输出结果:2023/10/25 17:53:04 INFO [][]uint8(nil)

问问这什么差异?

共有1个答案

夏建弼
2023-10-25

你好,这个问题的答案可能是由于在 Go 语言中,正则表达式引擎默认不包括换行符在 . 字符匹配中。这和 JavaScript 的默认行为是不同的。

在 Go 中,要匹配换行符,你需要使用 \s 匹配所有空白字符,包括空格、制表符、换页符等等,或者使用 [\f\n\r\t\v] 匹配特定的换行字符。

然而,在你的例子中,你试图匹配 \n\n 之间的文本,这可能需要一个稍微复杂的正则表达式。你可以尝试使用以下的正则表达式:

var matchMenu = regexp.MustCompile(`Contents\n\n((?:.(?!\n\n))*)\n\n`)

这个正则表达式使用了非贪婪的量词 *? 和否定前视 (?!...) 来匹配 \n\n 之间的文本。

然后你可以像之前那样使用 FindSubmatch 函数来获取匹配结果:

menuData := matchMenu.FindSubmatch(getContent())fmt.Printf("%#v\n", menuData)

这样应该能得到你想要的结果。希望这个答案能帮助你解决问题!

 类似资料:
  • 麻烦请问用golang的正则怎么把p标签的文本内容取出来,谢谢 补充,上边代码只是html一部分,

  • 根据下面的示例,我有一个正则表达式模式。 但是,作为一个一次性的派生,如果只有一个模式(匹配第一个实例的空白行&模式上方的一个空格),我可以让下面的内容匹配。 http://regex101.com/r/ey0ic7 但是,如果模式位于第一行,则没有匹配。

  • 基本模式匹配 一切从最基本的开始。模式,是正则表达式最基本的元素,它们是一组描述字符串特征的字符。模式可以很简单,由普通的字符串组成,也可以非常复杂,往往用特殊的字符表示一个范围内的字符、重复出现,或表示上下文。例如: ^once 这个模式包含一个特殊的字符^,表示该模式只匹配那些以once开头的字符串。例如该模式与字符串"once upon a time"匹配,与"There once was

  • 老师们怎么将这两个正则表达式合并成一个, 既能检查IPV4又能检查IPV6地址? 仅匹配ipv4或ipv6匹配都是正常的。 搞了好久搞不出来了... 请老师们指点一下。

  • 本文向大家介绍js正则表达式惰性匹配和贪婪匹配用法分析,包括了js正则表达式惰性匹配和贪婪匹配用法分析的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了js正则表达式惰性匹配和贪婪匹配用法。分享给大家供大家参考,具体如下: 在讲贪婪模式和惰性模式之前,先回顾一下JS正则基础: 写法基础: ①不需要双引号,直接用//包含 => /wehfwue123123/.test(); ②反斜杠\表示转义