regexp.Compile和regexp.CompilePOSIX有什么区别?

时间:2016-01-16 15:01:16

标签: regex go

有人可以提供一些示例来解释regexp.Compileregexp.CompilePOSIX之间的差异吗?我看了文档。但我无法获得直观的理解。

1 个答案:

答案 0 :(得分:6)

与Perl和POSIX兼容的正则表达式在大部分中类似,但在某些关键方面有所不同,例如子匹配。这是here

  

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

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

一些示例代码(playground):

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