regexp.Compile和regexp.compilepOfix之间有什么区别?

regexp.Compile和regexp.compilepOfix之间有什么区别?,regex,go,Regex,Go,有人能举一些例子来解释和之间的区别吗?我看了文件。但我无法直观地理解。与Perl和POSIX兼容的正则表达式在很大程度上相似,但在一些关键方面有所不同,例如子匹配。其中提到: POSIX定义,要解析子匹配,首先选择字符串中最左边开始的匹配。(这是传统的Perl行为,但在这里情况有所不同。)在从字符串最左边开始的子匹配中,选择最长的一个 假设您有一个正则表达式(foo | foobar)。当将此表达式与匹配多个子表达式的字符串进行匹配时(例如,foobarbaz将匹配两个子模式,foo和fooba

有人能举一些例子来解释和之间的区别吗?我看了文件。但我无法直观地理解。

与Perl和POSIX兼容的正则表达式在很大程度上相似,但在一些关键方面有所不同,例如子匹配。其中提到:

POSIX定义,要解析子匹配,首先选择字符串中最左边开始的匹配。(这是传统的Perl行为,但在这里情况有所不同。)在从字符串最左边开始的子匹配中,选择最长的一个

假设您有一个正则表达式
(foo | foobar)
。当将此表达式与匹配多个子表达式的字符串进行匹配时(例如,
foobarbaz
将匹配两个子模式,
foo
foobar
),与Perl兼容的正则表达式将返回第一个匹配(
foo
),而与POSIX兼容的正则表达式将返回最长匹配(
foobar

一些示例代码():


查看文档,它听起来像是
编译
使用了PCRE和其他POSIX;
package main

import "fmt"
import "regexp"

func main() {
    pattern := "(foo|foobar)"
    str := []byte("foobarbaz")

    rPCRE, _ := regexp.Compile(pattern)
    rPOSIX, _ := regexp.CompilePOSIX(pattern)

    matchesPCRE := rPCRE.Find(str)
    fmt.Println(string(matchesPCRE))
    // prints "foo"

    matchesPOSIX := rPOSIX.Find(str)
    fmt.Println(string(matchesPOSIX))
    // prints "foobar"
}