如何用JavaScript实现除单双引号内文本外其余内容转小写
需求:实现引号外内容转小写,引号内保留原大小写
现有基础代码(全内容转小写)
下面是一段能把文本框内所有内容转为小写的简单代码:
JavaScript 逻辑
function reformat() { // 将textarea的值赋值给变量 var str = my_text.value; // 转为小写 str = str.toLowerCase(); // 将新值设置回textarea my_text.value = str; }
HTML 页面结构
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css"> <div class="container-fluid" style="padding-top:10px;"> <textarea id="my_text" name="my_text" style="width:400px; height:150px;" class="form-control"> select reject_lookup_code "Look Up Code" , count(*) from ap_interface_rejections WHERE reject_lookup_code NOT IN ('THIS','that') group by reject_lookup_code </textarea> <hr /> <button onclick="reformat()">切换</button> </div> <!-- /container-fluid -->
已知的Notepad++实现方式
之前在Notepad++中,可用正则实现仅单引号内内容保留大小写,其余转小写的效果:
- 查找规则:
'[^']*'|([A-Z]) - 替换规则:
(?1\L$1:$0)
需求升级:JavaScript实现双/单引号内内容保留大小写
现在需要用JavaScript实现更全面的效果:除双引号(" ")和单引号(' ')内的文本保持原有大小写不变,其余所有内容转为小写。
输入示例
select reject_lookup_code "Look Up Code" , count(*) from ap_interface_rejections WHERE reject_lookup_code NOT IN ('THIS','that') group by reject_lookup_code
期望输出
select reject_lookup_code "Look Up Code" , count(*) from ap_interface_rejections where reject_lookup_code not in ('THIS','that') group by reject_lookup_code
JavaScript 实现方案
可以通过正则匹配结合替换函数实现,代码如下:
function reformat() { var str = my_text.value; // 匹配双引号内容、单引号内容、引号外内容 str = str.replace(/"([^"]*)"|'([^']*)'|([^'"]+)/g, function(match, doubleQuoteContent, singleQuoteContent, outsideContent) { // 双引号内内容直接返回 if (doubleQuoteContent !== undefined) { return `"${doubleQuoteContent}"`; } // 单引号内内容直接返回 if (singleQuoteContent !== undefined) { return `'${singleQuoteContent}'`; } // 引号外内容转小写后返回 return outsideContent.toLowerCase(); }); my_text.value = str; }
实现说明
- 正则
/"([^"]*)"|'([^']*)'|([^'"]+)/g会分三类匹配内容:双引号包裹的文本、单引号包裹的文本、不在任何引号内的文本。 - 替换函数根据捕获到的内容类型处理:引号内的文本直接保留原样,引号外的文本转为小写后返回。
内容的提问来源于stack exchange,提问作者4532066
相关产品推荐
相关产品推荐

