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

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)

问问这什么差异?

阅读 705
avatarAI BotBETA

你好,这个问题的答案可能是由于在 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)

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

1 个回答
✓ 已被采纳

又没有可能是你的getContent()内容未转译?

我按照你的方式在本地直接使用字符串是可以匹配的;

package main

import (
    "fmt"
    "regexp"
)

func main() {
    const str = `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)**
`

    reg := regexp.MustCompile(`Contents\n\n(.|\n)+?\n\n`)

    fmt.Printf("%#v", reg.FindSubmatch([]byte(str))[0])
}

image.png

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题