Golang 正则表达式匹配字符串仅对使用 OR 运算符分隔的字符串列表中的最后一个子字符串失败 |

Posted

技术标签:

【中文标题】Golang 正则表达式匹配字符串仅对使用 OR 运算符分隔的字符串列表中的最后一个子字符串失败 |【英文标题】:Golang regex match string fails only for last substring in a list of strings separated using OR operator | 【发布时间】:2021-12-17 02:17:09 【问题描述】:

我有一个正则表达式

"^test\/053783914460|182782814227|161046048738\/test\/\\S+\/\\d4\/"

我认为会匹配这个字符串: “test/161046048738/test/random/2021/”.

但它不匹配。不知道为什么它只匹配最后一个数字,当它匹配由或运算符 | 分隔的列表中的其他数字时,例如“test/182782814227/test/random/2021/”

https://play.golang.org/p/WsB0_C8yhHy 是我想要理解的脚本。

对不起,我是 golang 正则表达式的新手。

【问题讨论】:

【参考方案1】:

这是你的固定代码:

package main

import (
    "fmt"
    "regexp"
)

func main() 
    path := "test/161046048738/test/random/2021/"
    result, err := regexp.MatchString(`^test/(?:053783914460|182782814227|161046048738)/test/[^/\s]+/\d4/`, path)
    if err != nil 
        fmt.Println(err)
    
    fmt.Println("Value matched regex: ", result)

请参阅Go playground demo。

详情

^ - 字符串开头 test/ - 文字文本 (?:053783914460|182782814227|161046048738) - 三种选择之一 /test/ - /test/ 子字符串 [^/\s]+ - 除空格和/ 之外的一个或多个字符 /\d4/ - /,四位数字和一个 / 字符。

【讨论】:

谢谢你,但我仍在努力理解为什么我的不起作用。为什么我不能使用 \S+ 而不是 [^/\s]+? 我们为什么需要?:对于两种选择之一,这不是我们使用的原因吗?运营商? @RiyaJohn \S 匹配 / 字符,如果您需要匹配多个部分而不仅仅是一个,则使用 \S+(?:...) 是一个非捕获组,它比捕获组更有效,尤其是当您不使用捕获的文本时。您需要在此处对备选方案进行分组。

以上是关于Golang 正则表达式匹配字符串仅对使用 OR 运算符分隔的字符串列表中的最后一个子字符串失败 |的主要内容,如果未能解决你的问题,请参考以下文章

Python 操作Redis

python爬虫入门----- 阿里巴巴供应商爬虫

Python词典设置默认值小技巧

《python学习手册(第4版)》pdf

Django settings.py 的media路径设置

Python中的赋值,浅拷贝和深拷贝的区别