【问题标题】:Negative lookbehind alternative负后视替代
【发布时间】:2016-06-24 21:46:39
【问题描述】:

我有一个字符串

centenary

我只想匹配ten,前提是它前面没有cen

到目前为止,我有这个正则表达式:

(([^c][^e][^n])|^)ten

在以下情况下返回 true tenaryblahtenary 和 false 为 ctenarycetenarycentanary

package main

import (
    "fmt"
    "regexp"
)

func main() {
    txt := "ctenary"
    rx := `(([^c][^e][^n])|^)ten`
    re := regexp.MustCompile(rx)
    m := re.MatchString(txt)
    fmt.Println(m)
}

【问题讨论】:

  • 如果我正确地阅读了您的问题,您正在寻找一个前瞻替代方案。你可以试试(?:^|[^n]|[^e]n|[^c]en)(ten)
  • @Aaron 是的,我想匹配前面没有“cen”的“十”。我已经编辑了问题。
  • @SebastianProske 按预期工作!谢谢

标签: regex go


【解决方案1】:

由于缺少对前瞻或后瞻的支持,我们需要坚持使用否定字符类 - 但[^c][^e][^n] 并没有完全覆盖它,因为它不允许 cxxten 也不会覆盖没有的字符串ten 前 3 个字符。

我想出了(?:^|[^n]|(?:[^e]|^)n|(?:[^c]|^)en)ten,它将ten 存储到第一个捕获的组中。它正在为不完全匹配 cen 的每种可能方式创建替代方案。

另一种方法可能是匹配(.{0,3})(ten),如果第一组存储cen,则以编程方式丢弃匹配。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-01
    相关资源
    最近更新 更多