将Java中的正则表达式转换为golang。纠正我

时间:2018-09-26 11:16:19

标签: java regex go

Java正则表达式:

str.replaceFirst("(\\p{XDigit}{8})(\\p{XDigit}{4})(\\p{XDigit}{4})(\\p{XDigit}{4})(\\p{XDigit}+)", "$1-$2-$3-$4-$5")

我在Go中尝试过的东西:

re:=regexp.MustCompile("(\\p{XDigit}{8})(\\p{XDigit}{4})(\\p{XDigit}{4})(\\p{XDigit}{4})(\\p{XDigit}+)")

repStr := "$1-$2-$3-$4-$5"

str1:=re.ReplaceAllString(someString,repStr)

它说XDigit是未知字符类别

1 个答案:

答案 0 :(得分:4)

Java regex中,\p{XDigit}只是[0-9a-fA-F]的简写:

POSIX character classes (US-ASCII only)
\p{Lower}               A lower-case alphabetic character: [a-z]
\p{Upper}               An upper-case alphabetic character:[A-Z]
\p{ASCII}               All ASCII:[\x00-\x7F]
\p{Alpha}               An alphabetic character:[\p{Lower}\p{Upper}]
\p{Digit}               A decimal digit: [0-9]
\p{Alnum}               An alphanumeric character:[\p{Alpha}\p{Digit}]
\p{Punct}               Punctuation: One of !"#$%&'()*+,-./:;?@[\]^_`{|}~
\p{Graph}               A visible character: [\p{Alnum}\p{Punct}]
\p{Print}               A printable character: [\p{Graph}\x20]
\p{Blank}               A space or a tab: [ \t]
\p{Cntrl}               A control character: [\x00-\x1F\x7F]
\p{XDigit}              A hexadecimal digit: [0-9a-fA-F]
\p{Space}               A whitespace character: [ \t\n\x0B\f\r]

相同的[0-9a-fA-F]字符类可以用[[:xdigit:]] in Go regex表示。

您可以将Go模式编写为

re:=regexp.MustCompile("([[:xdigit:]]{8})([[:xdigit:]]{4})([[:xdigit:]]{4})([[:xdigit:]]{4})([[:xdigit:]]+)")

或者,

re:=regexp.MustCompile("([0-9a-fA-F]{8})([0-9a-fA-F]{4})([0-9a-fA-F]{4})([0-9a-fA-F]{4})([0-9a-fA-F]+)")

您可能会看到online Go regex demo here,这里是a Go demo

package main

import (
    "fmt"
    "regexp"
)

const sample = `0a1f0a1f0a1f0a1f0a1f0a1f0a1f 0a1f0a1f0a1f0a1f0a1f0a1f0a1f`

func main() {
    re := regexp.MustCompile(`([[:xdigit:]]{8})([[:xdigit:]]{4})([[:xdigit:]]{4})([[:xdigit:]]{4})([[:xdigit:]]+)`)
    repl := `$1-$2-$3-$4-$5`
    fmt.Println(re.ReplaceAllString(sample, repl))
}

结果:0a1f0a1f-0a1f-0a1f-0a1f-0a1f0a1f 0a1f0a1f-0a1f-0a1f-0a1f-0a1f0a1f

请注意,如果您只需要替换第一次出现的(如Java中那样,您使用的是String#replaceFirst),则可能需要将整个字符串与{{1} },然后替换字符串.*?,以匹配其余字符串,捕获它们并调整替换字符串以包含该字符串的这两个其他部分的占位符:

.*

请参见another regex demo

相关问题