首页 > 解决方案 > 如何选择具有自定义单词边界的第一个字符?

问题描述

我用这样的一系列词测试用例:

    {
        input:    "Halley's Comet",
        expected: "HC",
    },
    {
        input:    "First In, First Out",
        expected: "FIFO",
    },
    {
        input:    "The Road _Not_ Taken",
        expected: "TRNT",
    },

我想用一个正则表达式来匹配这些单词的所有第一个字母,避免 char: "_" 被匹配为第一个字母并计算单词中的单引号。
目前,我有这个正则表达式处理 pcre 语法,但不使用 Go regexp 包:(?<![a-zA-Z0-9'])([a-zA-Z0-9'])
我知道 Go 不支持环视,但我正在寻找一种好方法来做到这一点。

我还使用这个函数来获取所有字符串的数组:re.FindAllString(s, -1)

感谢您的帮助。

标签: regexgopcre

解决方案


Something that plays with character classes and word boundaries should suffice:

\b_*([a-z])[a-z]*(?:'s)?_*\b\W*

demo

Usage:

package main

import (
    "fmt"
    "regexp"
)

func main() {
    re := regexp.MustCompile(`(?i)\b_*([a-z])[a-z]*(?:'s)?_*\b\W*`)
    fmt.Println(re.ReplaceAllString("O'Brian's dog", "$1"))

}

推荐阅读