Как сопоставить несколько языков - PullRequest
0 голосов
/ 05 ноября 2018

Я пишу регулярное выражение в golang для захвата хэштегов, которые могут появляться на разных языках. Например, очевидным является английский, но могут быть латинские или арабские пользователи, которые попытаются создать хэштеги, используя этот набор символов. Мне известно имя класса символов Unicode, но как вы можете использовать несколько одновременно, не генерируя регулярные выражения для каждого?

пример кода:

r, err := regexp.Compile(`\B(\#[[:ascii:]]+\b)[^?!;]*`)

Это будет соответствовать "#hello #ذوق" и выводить []string{#hello, #ذوق}, но не будет совпадать только для "#ذوق"

1 Ответ

0 голосов
/ 05 ноября 2018

Я предлагаю использовать

\B#[\p{L}\p{N}\p{M}_]+

, где [\p{L}\p{N}\p{M}_] - это примерно \w шаблон с поддержкой Unicode. \p{L} соответствует любой букве Uniciode, \p{M} соответствует любой комбинированной метке, а \p{N} соответствует любой цифре Unicode.

См. Перейти демо :

package main

import (
    "fmt"
    "regexp"
)

func main() {
    text := "#hello #ذوق #citroën"
    r := regexp.MustCompile(`\B#[\p{L}\p{N}\p{M}_]+`)
    res := r.FindAllString(text, -1)
    for _, element := range res {
        fmt.Println(element)
    }
}

Выход:

#hello
#ذوق

С text := "#ذوق", выход составляет #ذوق.

См. regex demo .

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