You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

盲文文本适配应用中复杂大小写规则的正则表达式实现求助

盲文文本适配应用中复杂大小写规则的正则表达式实现求助

我正在开发一款能将普通文本转换为符合盲文规范的应用,其中大小写的处理规则有点绕,试了好多次都没完全搞定,想请大家支支招。

具体的大小写处理规则:

  • 单个大写字母前添加 :,示例::This is an :Example
  • 连续多个大写字母(或全大写单词)前要再加一个 :,也就是变成 ::,示例::This is ::ANOTHER ex::AMple, ::ALRIGHT
  • 如果连续出现3个及以上的全大写单词序列,要在序列开头加 -,同时去掉序列中间所有的 ::,只保留最后一个单词前的 ::,示例::This is -::A VERY LONG SENTENCE WITH A SEQUENCE OF ALL ::CAPS to serve ::AS ::AN :Example
  • 单词中间(排除首字母大写的情况)出现大写转小写时,要在大写字母后添加 ;,示例::This is my fin:A;l ::EXAM;ple

我自己的尝试过程

我用正则表达式一步步尝试实现这些规则,但总是出现规则冲突的问题,没法覆盖所有情况。一开始从简单规则入手,后来也试过先处理复杂规则,或者合并部分规则,结果都不太理想。我刚接触正则,实在有点摸不清头绪。

我的初始尝试代码:

// 给所有大写字母(串)前添加 :
var firstChange = text.replace(/[A-Z]+/g,':$&');

// 给连续多个大写字母前再加一个 :
var secondChange = firstChange.replace(/[([A-Z]{2,}/g,':$&');

// 给单词中间大写转小写的位置添加 ;
var thirdChange = secondChange.replace(/\B[A-Z]+(?=[a-z]/g,'$&;')

为了更清晰展示需求,我做了一个完整的转换示例:

原文本:
This is an Example. This is ANOTHER exAmple, ALRIGHT? This is A VERY LONG SENTENCE WITH A SEQUENCE OF ALL CAPS to serve AS AN Example. This is my finAl EXAMple.

转换后目标文本:
:This is an :Example. :This is ::ANOTHER ex::AM;ple, ::ALRIGHT? :This
is -::A VERY LONG SENTENCE WITH A SEQUENCE OF ALL ::CAPS to serve ::AS
::AN :Example. :This is my fin:A;l ::EXAM;ple


问题解决啦!

在@ChrisMaurer和@SaSkY的帮助下,我终于写出了能满足所有规则的代码(特别感谢@Sasky帮忙修正了第四处转换的问题):

完整的HTML+JavaScript实现代码如下:

<html>
<body>
<textarea id="area1" rows="4" cols="40" onkeyup="MyFunction()">
</textarea>
<textarea id="area2" rows="4" cols="40"></textarea>

<script>
var original = document.getElementById("area1");
var another = document.getElementById("area2");

function MyFunction() {
    // 给每个大写字母(串)前添加 :
    var firstChange = original.value.replace(/[A-Z]+/g, ':$&');
    // 给连续多个大写字母(或全大写单词)前再加一个 :
    var secondChange = firstChange.replace(/(::?[A-Z]{2,}|\b::?[A-Z]+\b)/g, ':$&');
    // 给连续3个及以上的全大写单词序列开头添加 -
    var thirdChange = secondChange.replace(/\B(::[A-Z]+(\s+::[A-Z]+){3,})/g, '-$&');
    // 移除长全大写序列中间多余的 ::,仅保留最后一个单词前的 ::
    var fourthChange = thirdChange.replace(/(?<=-::[A-Z]+\s(?:::[A-Z]+\s)*)::(?=[A-Z]+\s)(?![A-Z]+\s(?!::[A-Z]+\b))/g, '');
    // 单词中间出现大写转小写时,在大写字母后添加 ;
    var fifthChange = fourthChange.replace(/\B[A-Z](?=[a-z])/g, '$&;');
    // 更新结果文本框内容
    another.value = fifthChange;
}
</script>
</body>
</html>

备注:内容来源于stack exchange,提问作者Cassio Polegatto

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.23 08:49:05