盲文文本适配应用中复杂大小写规则的正则表达式实现求助
盲文文本适配应用中复杂大小写规则的正则表达式实现求助
我正在开发一款能将普通文本转换为符合盲文规范的应用,其中大小写的处理规则有点绕,试了好多次都没完全搞定,想请大家支支招。
具体的大小写处理规则:
- 单个大写字母前添加
:,示例::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
相关产品推荐
相关产品推荐

