当前位置: 首页 > 知识库问答 >
问题:

如何检索[]符文的第一个“完整”字符?

翁良弼
2023-03-14

我在试着写一个函数

func Anonymize(name string) string

匿名的名字。下面是一些输入和输出对的示例,让您了解它应该做什么:

Müller → M.
von der Linden → v. d. L.
Meyer-Schulze → M.-S.

该函数应该适用于由任意字符组成的名称。在实现此功能时,我有以下问题:

给定一个[]runestring,我如何计算出我必须使用多少个符文才能获得一个完整的字符,完整的意思是与该字符对应的所有修饰符和组合重音也被使用。例如,如果输入是[]rune{0x0041,0x0308,0x0066,0x0067}(对应于字符串BC,其中δ表示为A和组合diaresis的组合),该函数应该返回2,因为前两个符文会产生第一个字符δ。如果我只使用第一个符文,我会得到不正确的A。

我需要这个问题的答案,因为我想匿名的名字可能以重音字符开头,我不想去掉重音。

共有1个答案

严远
2023-03-14

您可以尝试以下函数(受“Go语言字符串长度”启发):

func FirstGraphemeLen(str string) int {
    re := regexp.MustCompile("\\PM\\pM*|.")
    return len([]rune(re.FindAllString(str, -1)[0]))
}

看这个例子:

r := []rune{0x0041, 0x0308, 0x0066, 0x0041, 0x0308, 0x0067}
s := string(r)
fmt.Println(s, len(r), FirstGraphemeLen(s))

输出:

ÄfÄg 6 2

该字符串可能使用6个符文,但其第一个字素使用2。

OP FUZxxl使用了另一种方法,使用unicode。IsMark(r)

IsMark报告符文是否为标记字符(M类)。

来源(来自FUZxxl的play.golang.org)包括:

// take one character including all modifiers from the last name
r, _, err := ln.ReadRune()
if err != nil {
    /* ... */
}

aln = append(aln, r)

for {
    r, _, err = ln.ReadRune()
    if err != nil {
        goto done
    }

    if !unicode.IsMark(r) {
        break
    }

    aln = append(aln, r)
}

aln = append(aln, '.')
/* ... */
 类似资料:
  • 问题内容: 我想找到字符串中任何“特殊”字符首次出现的索引,如下所示: …除非那是无效的Python语法。当然,我可以编写一个模拟此行为的函数: 我也可以使用正则表达式,但两种解决方案似乎都有些过分。在Python中有什么“明智”的方法吗? 问题答案: 您可以将enumerate和next与生成器表达式一起使用,获取第一个匹配项,或者如果s中没有字符,则返回None: 如果没有匹配项,则可以将您想

  • 问题内容: 有一个大写字符串的函数,我希望能够更改字符串的第一个字符以确保它是小写的。 如何在Python中做到这一点? 问题答案: 一线处理空字符串和:

  • 我正在尝试为一种相对简单但特殊的语言编写解析器。 简单地说,其中一条规则是,只有当星号是行的第一个字符时,注释行才由星号表示。我如何在ANTLR4中正式制定这样的规则?我考虑使用: 但我确信这不会在一行中使用多个行注释,因为末尾的换行符将作为标记的一部分使用,这意味着任何后续的注释行都将缺少所需的初始换行符,这将不起作用。有没有一种方法可以检查该行是否以开头,而无需使用之前的?

  • 我想要一个完整的未来,只发出完成的信号(例如,我没有返回值)。 我可以将CompletableFuture实例化为: 但是我应该向完整的方法提供什么呢?例如,我不能做

  • 问题内容: 我已经在SOAP消息中工作过,以从Web服务获取LoginToken,并将LoginToken存储在String中并用于打印。此打印[wdsd34svdf],但我只想wdsd34svdf,如何删除方括号。请任何人帮助我。 谢谢 例: 输出:[wdsd34svdf]我想要wdsd34svdf 问题答案: 这很容易,您需要先找到[和]的索引,然后再找到子字符串。(这里[总是在开始处,]在结

  • 一个显而易见的解决方案是: 这需要线性时间。我们能再快点吗? 这比线性时间快吗 还有哪些方法(效率是首要考虑的)<我见过这个,只是我只需要找到第一个数字。(还有,我不明白答案)。