识别和替换括号之间的非 ASCII 字符

Posted

技术标签:

【中文标题】识别和替换括号之间的非 ASCII 字符【英文标题】:Identify and replace non-ASCII characters between brackets 【发布时间】:2022-01-23 09:58:49 【问题描述】:

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

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

【问题讨论】:

请edit your question 添加示例文本和预期结果。 尝试使用\pCyrillic+ 搜索西里尔字母。 【参考方案1】:

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

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

确保 Match Case 选项已打开。查看带有 字符串的regex demo:

详情

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

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

【讨论】:

谢谢!这正是我所需要的。 但是,我发现您自己在替换中放错了字母M。我知道,这很棘手;)如果 N++ 可以选择为不同的字母使用不同的字体,那就太好了.. @AlCrow 感谢您的关注。替换模式现已修复。

以上是关于识别和替换括号之间的非 ASCII 字符的主要内容,如果未能解决你的问题,请参考以下文章

括号之间的Python正则表达式替换[重复]

ES6浅谈--解构,字符串扩展

在大括号之间搜索和替换文本(VS代码)

如何批量把TXT文本中括号之间的内容{内容都不一样}替换成NO

php替换大括号内的文字

用新数字替换第一个左括号和数字