js中正则表达式的摘录

正则表达式用于字符串处理,表单验证等场合,实用高效,但用到时总是不太把握,以致往往要上网查一番。我将一些常用的表达式收藏在这里,作备忘之用。本贴随时会更新。

匹配中文字符的正则表达式: [\u4e00-\u9fa5]

匹配双字节字符(包括汉字在内):[^\x00-\xff]

应用:计算字符串的长度(一个双字节字符长度计2,ASCII字符计1) :wink:

String.prototype.len=function(){return this.replace([^\x00-\xff]/g,"aa").length;}

匹配空行的正则表达式:\n[\s| ]*\r

匹配HTML标记的正则表达式:/<(.*)>.*<\/\1>|<(.*) \/>/

匹配首尾空格的正则表达式:(^\s*)|(\s*$)

应用:javascript中没有像vbscript那样的trim函数,我们就可以利用这个表达式来实现,如下:

String.prototype.trim = function()
{
return this.replace(/(^\s*)|(\s*$)/g, "");
}

利用正则表达式分解和转换IP地址:

下面是利用正则表达式匹配IP地址,并将IP地址转换成对应数值的Javascript程序:

function IP2V(ip)
{
re=/(\d+)\.(\d+)\.(\d+)\.(\d+)/g //匹配IP地址的正则表达式
if(re.test(ip))
{
return RegExp.$1*Math.pow(255,3))+RegExp.$2*Math.pow(255,2))+RegExp.$3*255+RegExp.$4*1
}
else
{
throw new Error("Not a valid IP address!")
}
}

不过上面的程序如果不用正则表达式,而直接用split函数来分解可能更简单,程序如下:

var ip="10.100.20.168"
ip=ip.split(".")
alert("IP值是:"+(ip[0]*255*255*255+ip[1]*255*255+ip[2]*255+ip[3]*1))

匹配Email地址的正则表达式:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*

匹配网址URL的正则表达式:http://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?

利用正则表达式去除字串中重复的字符的算法程序:

var s="abacabefgeeii"
var s1=s.replace(/(.).*\1/g,"$1")
var re=new RegExp("["+s1+"]","g")
var s2=s.replace(re,"")
alert(s1+s2) //结果为:abcefgi

我原来在优快云上发贴寻求一个表达式来实现去除重复字符的方法,最终没有找到,这是我能想到的最简单的实现方法。思路是使用后向引用取出包括重复的字符,再以重复的字符建立第二个表达式,取到不重复的字符,两者串连。这个方法对于字符顺序有要求的字符串可能不适用。

得用正则表达式从URL地址中提取文件名的javascript程序,如下结果为page1

s="http://www.gzcynet/page1.htm"
s=s.replace(/(.*\/){0,}([^\.]+).*/ig,"$2")
alert(s)

利用正则表达式限制网页表单里的文本框输入内容:

用正则表达式限制只能输入中文:onkeyup="value=value.replace(/[^\u4E00-\u9FA5]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\u4E00-\u9FA5]/g,''))"

用正则表达式限制只能输入全角字符: onkeyup="value=value.replace(/[^\uFF00-\uFFFF]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\uFF00-\uFFFF]/g,''))"

用正则表达式限制只能输入数字:onkeyup="value=value.replace(/[^\d]/g,'') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))"

用正则表达式限制只能输入数字和英文:onkeyup="value=value.replace(/[\W]/g,'') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))"
<think>我们正在处理一个字符串:"DFGPO,(PTC5,PTC4,PTC3,PTC2),(gTESTPORT_DATA)"目标:匹配该行,然后将第二个括号内的内容(即"gTESTPORT_DATA")作为键,第一个括号内的内容(即"PTC5,PTC4,PTC3,PTC2")作为值。注意:之前版本的正则表达式可能没有正确匹配,因此我们需要调整。分析字符串结构:-以"DFGP"开头-然后是一个单词(这里是"O"),后面紧跟一个逗号-然后是第一组括号,里面包含逗号分隔的内容(没有括号嵌套)-然后是逗号-然后是第二组括号,里面是键(没有逗号,但实际可能有?题目中是单个标识符)我们设计正则表达式:/DFGP\s+(\w+)\s*,\s*\(([^()]*)\)\s*,\s*\(([^()]*)\)/解释:-`DFGP\s+`:匹配"DFGP"和至少一个空白(空格或制表等)-`(\w+)`:匹配一个单词(这里是"O"),并捕获-`\s*,\s*`:匹配逗号,前后可能有空白-`\(([^()]*)\)`:匹配第一个括号,括号内不能有括号(因为题目没有嵌套),我们使用`[^()]*`匹配任意非括号字符-同理匹配第二个括号但是,我们不需要捕获中间的那个单词(即"O"),题目要求只取两个括号的内容。而且题目要求第二个括号作为键,第一个括号作为值。修正正则:我们只关心两个括号内的内容,所以可以这样写:/DFGP\s+\w+\s*,\s*\(([^()]*)\)\s*,\s*\(([^()]*)\)/这里:-第一个括号内的内容由第一个捕获组`([^()]*)`匹配-第二个括号内的内容由第二个捕获组`([^()]*)`匹配注意:如果括号内允许空格,我们这里没有排除空格,所以是可以的。但是,我们观察到输入字符串中第一个括号前有一个空格?实际上,在逗号后面没有空格,但正则中我们用了`\s*`可以匹配0个或多个空格。测试一下:输入:"DFGPO,(PTC5,PTC4,PTC3,PTC2),(gTESTPORT_DATA)"匹配:-"DFGPO"->匹配"DFGP"+空格+"O"-逗号:匹配","-第一个括号:匹配"(PTC5,PTC4,PTC3,PTC2)",捕获组1得到"PTC5,PTC4,PTC3,PTC2"-逗号:匹配","-第二个括号:匹配"(gTESTPORT_DATA)",捕获组2得到"gTESTPORT_DATA"这样,我们就能将捕获组2作为键,捕获组1作为值。代码实现:注意:如果一行中有多个这样的结构,我们需要用全局匹配,但题目是一行一个。下面给出代码:</think>### JavaScript 正则表达式解决方案 在 JavaScript 中,正则表达式是处理字符串匹配和提取的强大工具。以下是一个完整的解决方案,用于匹配指定行并提取键值对: ```javascript // 输入字符串 const input = "DFGP O,(PTC5,PTC4,PTC3,PTC2),(gTESTPORT_DATA)"; // 优化后的正则表达式 const regex = /DFGP\s+\w+\s*,\s*\(([^)]+)\)\s*,\s*\(([^)]+)\)/; // 执行匹配 const match = input.match(regex); if (match) { // 提取值(第一个括号内容) const value = match[1]; // 提取键(第二个括号内容) const key = match[2]; // 创建结果对象 const result = { [key]: value }; console.log("匹配成功!"); console.log("结果对象:", result); // 输出: { gTESTPORT_DATA: 'PTC5,PTC4,PTC3,PTC2' } } else { console.log("未找到匹配项"); } ``` ### 正则表达式详解 ```regex /DFGP\s+\w+\s*,\s*\(([^)]+)\)\s*,\s*\(([^)]+)\)/ ``` 1. **DFGP** - 匹配字面字符串 "DFGP" 2. **\s+** - 匹配一个或多个空白字符(空格、制表符等) 3. **\w+** - 匹配一个或多个单词字符(字母、数字或下划线) 4. **\s*,\s*** - 匹配逗号,允许前后有任意空白 5. **\(([^)]+)\)** - 匹配括号及其内容: - **\(** - 转义左括号 - **([^)]+)** - 捕获组1:匹配一个或多个非右括号的字符 - **\)** - 转义右括号 6. **\s*,\s*** - 匹配逗号,允许前后有任意空白 7. **\(([^)]+)\)** - 匹配第二个括号及其内容(捕获组2) ### 处理多个匹配项 ```javascript const multiInput = ` DFGP O,(PTC5,PTC4,PTC3,PTC2),(gTESTPORT_DATA) DFGP I,(PTB3,PTB2,PTB1,PTB0),(gTESTPORT_ADDR) DFGP X,(A1,A2,A3),(gANOTHER_PORT) `; const regexGlobal = /DFGP\s+\w+\s*,\s*\(([^)]+)\)\s*,\s*\(([^)]+)\)/g; const resultMap = new Map(); let match; while ((match = regexGlobal.exec(multiInput)) !== null) { const value = match[1]; const key = match[2]; resultMap.set(key, value); } console.log("提取的多个键值对:"); console.log([...resultMap.entries()]); /* 输出: [ ["gTESTPORT_DATA", "PTC5,PTC4,PTC3,PTC2"], ["gTESTPORT_ADDR", "PTB3,PTB2,PTB1,PTB0"], ["gANOTHER_PORT", "A1,A2,A3"] ] */ ``` ### 正则表达式调试技巧 如果正则表达式不工作,可以使用以下方法调试: 1. **使用在线工具**: - [Regex101](https://regex101.com/) - [RegExr](https://regexr.com/) 2. **逐步分解正则**: ```javascript // 测试正则的各部分 const parts = [ /DFGP/, // 匹配 "DFGP" /\s+/, // 匹配空白 /\w+/, // 匹配标识符 /\s*,\s*/, // 匹配逗号 /\(([^)]+)\)/, // 匹配第一个括号内容 /\s*,\s*/, // 匹配逗号 /\(([^)]+)\)/ // 匹配第二个括号内容 ]; // 测试每个部分是否匹配 parts.forEach((part, i) => { const test = input.match(part); console.log(`部分 ${i+1}:`, test ? "匹配成功" : "匹配失败", part.toString()); }); ``` ### 处理复杂情况的增强版 ```javascript // 支持括号内可能包含逗号但不包含嵌套括号的情况 const complexInput = "DFGP O,(PTC5, PTC4, 'test,value', PTC2),(gTESTPORT_DATA)"; // 增强版正则:允许括号内包含逗号但不包含右括号 const complexRegex = /DFGP\s+\w+\s*,\s*\(([^)]+)\)\s*,\s*\(([^)]+)\)/; const complexMatch = complexInput.match(complexRegex); if (complexMatch) { const value = complexMatch[1]; const key = complexMatch[2]; console.log("复杂匹配成功:", { [key]: value }); // 输出: { gTESTPORT_DATA: "PTC5, PTC4, 'test,value', PTC2" } } else { console.log("复杂匹配失败"); } ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值