正则表达式实践篇

记录一下,转自张老师的小测

排版规则出自 译文排版规则指北

空格

中英文之间需要增加空格

中文与数字之间需要增加空格

数字与单位之间需要增加空格

全角标点与其他字符之间不加空格

标点符号

不重复使用标点符号

破折号前后需要增加一个空格

全角和半角

使用全角中文标点

数字使用半角字符

遇到完整的英文整句、特殊名词,其內容使用半角标点

直接上代码:


<script type="text/javascript">
// 全角转半角
DBC2SBC = function(str) {
    var result = '';
    var i, code;
    if (str == '。') {
    	return '.';
    }
    for (i = 0 ; i < str.length; i++) {
        code = str.charCodeAt(i);
        if (code >= 65281 && code <= 65373) {
            result += String.fromCharCode(str.charCodeAt(i) - 65248);
        } else if (code == 12288) {
            result += String.fromCharCode(str.charCodeAt(i) - 12288 + 32);
        } else {
        	result += String.fromCharCode(str.charCodeAt(i));
        }
    }

    return result;
};
SBC2DBC = function (str){
	var result = ''; 
    for (var i=0; i < str.length; i++) { 
        if(str.charCodeAt(i)==32){ 
            result = result + String.fromCharCode(12288); 
        } 
        if (str.charCodeAt(i) < 127) { 
            result = result + String.fromCharCode(str.charCodeAt(i) + 65248); 
        } 
    } 
    return result; 
} 

function charCheck(str) {
	// 中文标点
  	var strPunct = '!()【】『』「」《》“”‘’;:,。?、';
  	var strPunctHalf = '!()[]"\';:,.?';

  	var regPunct = strPunct.split('').join('|');
  	var regPunctHalf = strPunctHalf.split('').join('|\\');

  	var regs = [{
        reg: /[\u4e00-\u9fa5]([A-Za-z])|([A-Za-z])[\u4e00-\u9fa5]/g,
        txt: '中英文之间需要增加空格',
        output: function (matches, $1, $2) {
        	if (/^[A-Za-z]/.test(matches)) {
        		return matches.replace($2, $2 + ' ');
        	}
        	return matches.replace($1, ' ' + $1);
        }
    }, {
        reg: /[\u4e00-\u9fa5]\d+\s*|\s*\d+[\u4e00-\u9fa5]/g,
        txt: '中文与数字之间需要增加空格',
        output: function (matches) {
        	return matches.replace(/(\d+)/g, ' $1 ').replace(/\s{2,}/, ' ');
        }
    }, {
        reg: /\d[A-Z]+/g,
        txt: '数字与单位之间需要增加空格',
        output: function (matches) {
        	return matches.replace(/(\d)/, '$1 ');
        }
    }, {
        reg: new RegExp(`[${regPunct}] +| +[${regPunct}]`, 'g'),
        txt: '全角标点与其他字符之间不加空格',
        output: function (matches) {
        	return matches.trim();
        }
    }, {
        reg: new RegExp(`(${regPunct})\\1+`, 'g'),
        txt: '不重复使用标点符号',
        output: function (matches) {
        	return matches.slice(0, 1);
        }
    }, {
        reg: /\S——|——\S/g,
        txt: '破折号前后需要增加一个空格',
        output: function (matches) {
        	return matches.replace('——', ' —— ');
        }
    }, {
        reg: new RegExp(`[\u4e00-\u9fa5][a-z]*( *[${regPunctHalf}] *)|( *[${regPunctHalf}] *)[a-z]*[\u4e00-\u9fa5]`, 'gi'),
        txt: '使用全角中文标点',
        output: function (matches, $1) {
        	return matches.replace($1, function (match1) {
        		return ({
        			'!': '!',
        			'?': '?',
        			'.': '。',
        			',': ',',
        			';': ';',
        			':': ':',
        			'(': '(',
        			')': ')'
        		})[match1.trim()] || match1;
        	});
        }
    }, {
        reg: /[\uFF10-\uFF19]+/g,
        txt: '数字使用半角字符',
        output: function (matches) {
        	return DBC2SBC(matches);
        }
    }, {
        reg: new RegExp(`([A-Za-z]+[${regPunct}|\\s])+[A-Za-z]*([${regPunct}|\\s][A-Za-z]+)+`, 'g'),
        txt: '遇到完整的英文整句,其內容使用半角标点',
        output: function (matches) {
        	return DBC2SBC(matches);
        }
    }];
	var result = str;
	var output = str;

  	if (str) {
  		regs.forEach(function(regObj, index) {
		    var reg = regObj.reg;
		    // 一个替换,一个匹配
		    result = result.replace(reg, function (matches) {
		    	return `<mark title="${index}">${matches}</mark>`
		    });
		    // 输出过滤后的内容
			output = output.replace(reg, regObj.output);
		});
  	}
  // 输出
  eleResult.innerHTML = result;
  eleOutput.innerHTML = output;

  if (result !== str) {
    eleResult.classList.add('error');
  } else {
  	eleResult.classList.remove('error');
  }

  Array.from(eleResult.querySelectorAll('mark')).forEach(function (eleMark) {
  	var title = eleMark.title;
  	eleMark.setAttribute('data-title', regs[title].txt);
  	eleMark.removeAttribute('title');
  });
}

// 事件
eleInput.addEventListener('input', function () {
	charCheck(this.value.trim());
});
charCheck(eleInput.value.trim());
</script>


字符转义


<script type="text/javascript">
//去掉html标签
function removeHtmlTab(tab) {
 return tab.replace(/&lt;[^&lt;&gt;]+?&gt;/g,'');//删除所有HTML标签
}

//普通字符转换成转意符
function html2Escape(sHtml) {
 return sHtml.replace(/[&lt;&gt;&amp;"]/g,function(c){return {'&lt;':'&lt;','&gt;':'&gt;','&amp;':'&amp;','"':'"'}[c];});
}

//转意符换成普通字符
function escape2Html(str) {
 var arrEntities={'lt':'&lt;','gt':'&gt;','nbsp':' ','amp':'&amp;','quot':'"'};
 return str.replace(/&amp;(lt|gt|nbsp|amp|quot);/ig,function(all,t){return arrEntities[t];});
}

//  转成空格
function nbsp2Space(str) {
 var arrEntities = {'nbsp' : ' '};
 return str.replace(/&amp;(nbsp);/ig, function(all, t){return arrEntities[t]})
}

//回车转为br标签
function return2Br(str) {
 return str.replace(/\r?\n/g,"<br/>");
}

//去除开头结尾换行,并将连续3次以上换行转换成2次换行
function trimBr(str) {
 str=str.replace(/((\s| )*\r?\n){3,}/g,"\r\n\r\n");//限制最多2次换行
 str=str.replace(/^((\s| )*\r?\n)+/g,'');//清除开头换行
 str=str.replace(/((\s| )*\r?\n)+$/g,'');//清除结尾换行
 return str;
}

// 将多个连续空格合并成一个空格
function mergeSpace(str) {
 str=str.replace(/(\s| )+/g,' ');
 return str;
}
</script>



评论  表情