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

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

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

【问题讨论】:

  • edit your question 添加示例文本和预期结果。
  • 尝试使用\p{Cyrillic}+ 搜索西里尔字母。

标签: regex replace notepad++


【解决方案1】:

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

查找内容(?:\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

详情

  • (?:\G(?!\A)|\[) - 上一次成功匹配的结束或 [ 字符
  • [a-zA-Z.]* - 零个或多个 . 或 ASCII 字母
  • \K - 匹配重置运算符,从整个匹配内存缓冲区中丢弃当前匹配的文本
  • (?:(А)|(а)|(І)|(і)|(В)|(С)|(с)|(Е)|(е)|(Р)|(Т)|(т)|(О)|(о)|(К)|(к)|(Х)|(х)|(М)) - 一个非捕获组,包含 19 个备选方案,每个备选方案都放入一个单独的捕获组中
  • (?=[[: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) 替换模式将 А 替换为 A (\u0410) 如果第 1 组匹配,а (\u0430) 替换为 a 如果第 2 组匹配,等等。

【讨论】:

  • 谢谢!这正是我所需要的。
  • 但是,我发现您自己在替换中放错了字母M。我知道,这很棘手;)如果 N++ 可以选择为不同的字母使用不同的字体,那就太好了..
  • @AlCrow 感谢您的关注。替换模式现已修复。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-26
  • 2017-12-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多