正则表达式匹配具有特定变音符号的字符

Nat*_*enn 6 regex unicode perl diacritics

在正则表达式中是否有任何方法可以为具有特定变音符号的字符指定匹配?让我们说一个重要的口音.要做到这一点,最重要的是转到严重重音维基百科页面,复制它显示的所有字符,然后从中制作一个字符类:

/[à??è??ì?ò??ù????]/i
Run Code Online (Sandbox Code Playgroud)

这很乏味.我希望像\p{hasGraveAccent}我这样的Unicode属性,但我找不到那样的东西.搜索解决方案只会出现人们试图匹配字符而忽略变音符号的问题,这涉及执行某种规范化,这不是我想要的.

Dak*_*san 0

这是一个有点棘手的问题,但这是可能的。首先,您必须将 unicode 字符串规范化为 4 种形式之一。有关规范化的信息在这里,具有不同规范化的字符示例图在这里,以及规范化字符的良好图表在这里。本质上,规范化只是确保处理变音符号时所有字符都采用相同的格式。Golang 对此有很好的支持,大多数语言都应该包含库来执行此操作。

\n\n

因此,对于我的示例,将字符串转换为“标准化形式 D”(NFD) 和 utf32,因此所有 unicode 字符都是 4 个字节的代码点。

\n\n

所有重音符号的变音符号旁边都有 0x0300。因此,您可以在 ascii 模式(不是 unicode 模式)下对....\\x00\\x00\\x03\\x00. 从那里你必须提取它所在的符文位置。这可以通过不同的方法来完成,具体取决于你使用的编码。

\n\n

因此,如果您的除法为 4,您就会知道它是一个有效的字符。

\n\n

除此之外,没有官方的 Perl 字符分组来执行此操作。

\n\n

以 Perl 代码为例:

\n\n
use Encode;\nuse Unicode::Normalize;\n\n$StartUTF8=\'x\xc3\xa0a\xc3\xa2\xc3\xa8a\xc3\xaa\';\n$PerlEncoded=decode(\'utf8\', $StartUTF8);\n$PerlNormalized=NFD($PerlEncoded); \n$UTF32Normalized=encode(\'utf32\', $PerlNormalized);\n\nwhile($UTF32Normalized =~ /(....\\x00\\x00\\x03\\x00)/gs) {\n    $Pos=pos($UTF32Normalized)-8;\n    if($Pos%4==0) {\n        print("$Pos\\n");\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

但此时,您可能只是对字符进行 for 循环:-\\

\n\n

我还尝试了在不需要使用 //c 进行位置测试的情况下进行匹配,但由于某种原因它不起作用。

\n\n

/^(?:....)*?(....\\x00\\x00\\x03\\x00)/gcs

\n