识别和替换括号之间的非 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 字符的主要内容,如果未能解决你的问题,请参考以下文章