识别并替换括号中的非 ASCII 字符

Identify and replace non-ASCII characters between brackets

我有以下结构的标签(只有括号内的 ASCII 字符):[Root.GetSomething],相反,一些贡献者最终提交了看起来类似于拉丁字符的西里尔字符的贡献,例如[Rооt.GеtSоmеthіng]。 我需要定位,然后用方括号内匹配的 ASCII 字符替换那些不一致的地方。

我试过了\[([АаІіВСсЕеРТтОоКкХхМ]+)\](\[)([^\x00-\x7F]+)(\]),以及范围的一些变体,但这些搜索没有看到任何匹配项。我似乎在正则表达式执行逻辑中遗漏了一些重要的东西。

您可以使用正则表达式匹配 [ + 字母或 . + ] 和条件替换模式之间的任何“有趣的”西里尔字符:

查找内容(?:\G(?!\A)|\[)[a-zA-Z.]*\K(?:(А)|(а)|(І)|(і)|(В)|(С)|(с)|(Е)|(е)|(Р)|(Т)|(т)|(О)|(о)|(К)|(к)|(Х)|(х)|(М))(?=[[:alpha:].]*])
替换为(?1A:?2a:?3I:?4i:?5B:?6C:?7c:?8E:?9e:?{10}P:?{11}T:?{12}t:?{13}O:?{14}o:?{15}K:?{16}k:?{17}X:?{18}x:?{19}M)

确保 Match Case 选项已开启。看到一个 regex demo with a 字符串:

详情:

  • (?:\G(?!\A)|\[) - 上一次成功匹配的结尾或 [ char
  • [a-zA-Z.]* - 零个或多个 . 或 ASCII 字母
  • \K - 匹配重置运算符,从整体匹配内存缓冲区中丢弃当前匹配的文本
  • (?:(А)|(а)|(І)|(і)|(В)|(С)|(с)|(Е)|(е)|(Р)|(Т)|(т)|(О)|(о)|(К)|(к)|(Х)|(х)|(М)) - 一个包含 19 个备选方案的非捕获组,每个备选方案都被放入一个单独的捕获组中
  • (?=[[:alpha:].]*]) - 需要零个或多个字母或 . 的正面前瞻,然后是紧靠当前位置右侧的 ] 字符。

如果第 1 组匹配,(?1A:?2a:?3I:?4i:?5B:?6C:?7c:?8E:?9e:?{10}P:?{11}T:?{12}t:?{13}O:?{14}o:?{15}K:?{16}k:?{17}X:?{18}x:?{19}M) 替换模式将 А 替换为 A (\u0410),将 а (\u0430) 替换为a 如果第 2 组匹配,等等