Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 如何选择具有自定义单词边界的第一个字符?_Regex_Go_Pcre - Fatal编程技术网

Regex 如何选择具有自定义单词边界的第一个字符?

Regex 如何选择具有自定义单词边界的第一个字符?,regex,go,pcre,Regex,Go,Pcre,我有过这样一系列的测试用例: { input: "Halley's Comet", expected: "HC", }, { input: "First In, First Out", expected: "FIFO", }, { input: "The Road _Not_ Taken", expected: "TRNT", },

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

    {
        input:    "Halley's Comet",
        expected: "HC",
    },
    {
        input:    "First In, First Out",
        expected: "FIFO",
    },
    {
        input:    "The Road _Not_ Taken",
        expected: "TRNT",
    },
我希望使用一个正则表达式匹配这些单词的所有首字母,避免将char:“\u1”作为首字母匹配,并计算单词中的单个引号。
目前,我有这个正则表达式处理pcre语法,但没有使用Go regexp包:
(?
我知道围观不受围棋的支持,但我正在寻找一种很好的方法

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


感谢您的帮助。

使用字符类和单词边界就足够了:

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

用法:

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"))

}

使用字符类和单词边界就足够了:

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

用法:

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"))

}

ftr,无regexp的解决方案

package main

import (
    "fmt"
)

func main() {
    inputs := []string{"Hallمرحباey's Comet", "First In, First Out", "The Road _Not_ Taken", "O'Brian's Dog"}
    c := [][]string{}
    w := [][]string{}
    for _, input := range inputs {
        c = append(c, firstLet(input))
        w = append(w, words(input))
    }
    fmt.Printf("%#v\n", w)
    fmt.Printf("%#v\n", c)
}

func firstLet(in string) (out []string) {
    var inword bool
    for _, r := range in {
        if !inword {
            if isChar(r) {
                inword = true
                out = append(out, string(r))
            }
        } else if r == ' ' {
            inword = false
        }
    }
    return out
}

func words(in string) (out []string) {
    var inword bool
    var w []rune
    for _, r := range in {
        if !inword {
            if isChar(r) {
                w = append(w, r)
                inword = true
            }
        } else if r == ' ' {
            if len(w) > 0 {
                out = append(out, string(w))
                w = w[:0]
            }
            inword = false
        } else if r != '_' {
            w = append(w, r)
        }
    }
    if len(w) > 0 {
        out = append(out, string(w))
    }
    return out
}

func isChar(r rune) bool {
    return (r >= 'a' && r <= 'z') || (r >= 'A' && r <= 'Z')
}

ftr,无regexp的解决方案

package main

import (
    "fmt"
)

func main() {
    inputs := []string{"Hallمرحباey's Comet", "First In, First Out", "The Road _Not_ Taken", "O'Brian's Dog"}
    c := [][]string{}
    w := [][]string{}
    for _, input := range inputs {
        c = append(c, firstLet(input))
        w = append(w, words(input))
    }
    fmt.Printf("%#v\n", w)
    fmt.Printf("%#v\n", c)
}

func firstLet(in string) (out []string) {
    var inword bool
    for _, r := range in {
        if !inword {
            if isChar(r) {
                inword = true
                out = append(out, string(r))
            }
        } else if r == ' ' {
            inword = false
        }
    }
    return out
}

func words(in string) (out []string) {
    var inword bool
    var w []rune
    for _, r := range in {
        if !inword {
            if isChar(r) {
                w = append(w, r)
                inword = true
            }
        } else if r == ' ' {
            if len(w) > 0 {
                out = append(out, string(w))
                w = w[:0]
            }
            inword = false
        } else if r != '_' {
            w = append(w, r)
        }
    }
    if len(w) > 0 {
        out = append(out, string(w))
    }
    return out
}

func isChar(r rune) bool {
    return (r >= 'a' && r <= 'z') || (r >= 'A' && r <= 'Z')
}

使用具有单词边界的内容不是一个选项?使用具有单词边界的内容不是一个选项?您的解决方案会为您针对OP原始pcre模式(
(?)添加的输入返回意外结果.我不能使用这个正则表达式来匹配我需要的所有字符串,我可以使用什么函数来获取所有字符串submatches@LoicRoux:如果需要更多子匹配,请在需要的位置添加捕获组,但请给出问题的说明(带示例),如果没有这些信息,我无法为您提供更多帮助。谢谢,但我检查了文档,发现了不同的解决方案,可以使用
FindSubmatch()等函数
。您的代码运行良好,只是我的代码使用了
findAllStrings
来获取所有匹配项的数组,因此您的正则表达式没有处理它。您的解决方案会为您添加的与OP原始pcre模式(
(?)有关的输入返回意外结果.我不能使用这个正则表达式来匹配我需要的所有字符串,我可以使用什么函数来获取所有字符串submatches@LoicRoux:如果需要更多子匹配,请在需要的位置添加捕获组,但请给出问题的说明(带示例),如果没有这些信息,我无法为您提供更多帮助。谢谢,但我检查了文档,发现了不同的解决方案,可以使用
FindSubmatch()等函数
。您的代码运行良好,只是我使用了
findAllStrings
来获取所有匹配项的数组,所以您的正则表达式没有处理它。不过,应该始终编写一个基准来验证这一点。我可以提前说一些事情,如果您要在循环中重复使用它,请调整签名以作为输入参数呃,防止进一步无用的分配。分配是这些函数中的瓶颈,以充分利用这种编程语言。分配必须在您编写的整个管道的范围内考虑。非常感谢,我的初学者的宝贵建议。我使用Vs代码测试用例,它为我提供了一个测试。这足够了吗?请检查这个答案,它演示了如何继续优化代码好的,我仍然在玩你的代码,很好理解…但是,应该始终编写一个基准来验证。我可以提前说一些事情,如果你要在循环中重复使用,请调整签名以e作为一个输入参数输出,并防止进一步无用的分配。分配是这些函数中的瓶颈,以充分利用这种编程语言。分配必须在您编写的整个管道范围内考虑。非常感谢,为我的初学者提供了宝贵的提示。我使用Vs代码测试用例,它为我提供了一个测试的总执行时间。足够吗?请检查这个答案,它演示了如何继续优化代码好的,我还在玩你的代码,很好理解。。。