我在试着写一个函数
func Anonymize(name string) string
匿名的名字。下面是一些输入和输出对的示例,让您了解它应该做什么:
Müller → M.
von der Linden → v. d. L.
Meyer-Schulze → M.-S.
该函数应该适用于由任意字符组成的名称。在实现此功能时,我有以下问题:
给定一个[]rune
或string
,我如何计算出我必须使用多少个符文才能获得一个完整的字符,完整的意思是与该字符对应的所有修饰符和组合重音也被使用。例如,如果输入是[]rune{0x0041,0x0308,0x0066,0x0067}
(对应于字符串BC,其中δ表示为A和组合diaresis的组合),该函数应该返回2,因为前两个符文会产生第一个字符δ。如果我只使用第一个符文,我会得到不正确的A。
我需要这个问题的答案,因为我想匿名的名字可能以重音字符开头,我不想去掉重音。
您可以尝试以下函数(受“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 问题答案: 这很容易,您需要先找到[和]的索引,然后再找到子字符串。(这里[总是在开始处,]在结
一个显而易见的解决方案是: 这需要线性时间。我们能再快点吗? 这比线性时间快吗 还有哪些方法(效率是首要考虑的)<我见过这个,只是我只需要找到第一个数字。(还有,我不明白答案)。