Преобразование регулярного выражения в Java для Голанга.Исправь меня - PullRequest
0 голосов
/ 26 сентября 2018

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 голосов
/ 26 сентября 2018

В Java regex , \p{XDigit} является просто сокращением для [0-9a-fA-F]:

<b>POSIX character classes (US-ASCII only)</b>
\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]
<b>\p{XDigit}              A hexadecimal digit: [0-9a-fA-F]</b>
\p{Space}               A whitespace character: [ \t\n\x0B\f\r]

Тот же самый класс символов [0-9a-fA-F] можно выразить с помощью [[:xdigit:]] в регулярном выражении Go .

Вы можете написать шаблон 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]+)")

Вы можете увидеть онлайн Go regex demo здесь и вот 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), вы, вероятно, захотите сопоставить всю строку с .*? перед шаблоном, который нужно заменить, а затем .* после негочтобы сопоставить остальную часть строки, захватите их и отрегулируйте строку замены, чтобы она содержала заполнители для этих двух дополнительных частей строки:

re:=regexp.MustCompile("^(.*?)([[:xdigit:]]{8})([[:xdigit:]]{4})([[:xdigit:]]{4})([[:xdigit:]]{4})([[:xdigit:]]+)(.*)$")
repStr := "$1$2-$3-$4-$5-$6$7"

См. еще одну демонстрацию регулярных выражений .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...