常用正则大全
Posted 凯小默
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了常用正则大全相关的知识,希望对你有一定的参考价值。
正则表达式相关知识点
转义字符
如果想要匹配特殊字符的话,就得使用元字符 \\
, 它是转义字符字符,让其后续的字符失去其本来的含义。
特殊字符 | 正则表达式 | 记忆方式 |
---|---|---|
换行符 | \\n | new line |
换页符 | \\f | form feed |
回车符 | \\r | return |
空白符 | \\s | space |
制表符 | \\t | tab |
垂直制表符 | \\v | vertical tab |
回退符 | [\\b] | backspace,之所以使用[]符号是避免和\\b重复 |
匹配多个字符的简便正则表达式
匹配区间 | 正则表达式 | 记忆方式 |
---|---|---|
除了换行符之外的任何字符 | . | 句号,除了句子结束符 |
单个数字, [0-9] | \\d | digit |
除了[0-9] | \\D | not digit |
包括下划线在内的单个字符,[A-Za-z0-9_] | \\w | word |
非单字字符 | \\W | not word |
匹配空白字符,包括空格、制表符、换页符和换行符 | \\s | space |
匹配非空白字符 | \\S | not space |
循环与重复
匹配规则 | 元字符 |
---|---|
0次或1次 | ? |
0次或无数次 | * |
1次或无数次 | + |
特定次数 | x, min, max |
- x: x次
- min, max: 介于min次到max次之间
- min, : 至少min次
- 0, max: 至多max次
字符串边界
边界和标志 | 正则表达式 | 记忆方式 |
---|---|---|
单词边界 | \\b | boundary |
非单词边界 | \\B | not boundary |
字符串开头 | ^ | - |
字符串结尾 | $ | - |
多行模式 | m 标志 | multiple of lines |
忽略大小写 | i 标志 | ignore case, case-insensitive |
全局模式 | g 标志 | global |
回溯引用
所谓 回溯引用(backreference) 指的是模式的后面部分引用前面已经匹配到的子字符串。
回溯引用的语法 \\1,\\2,....,
:
\\1
:表示引用的第一个子表达式\\2
:表示引用的第二个子表达式- …
\\0
:则表示整个表达式
例子:假设现在要在下面这个文本里匹配两个连续相同的单词?
I am am kaimo not not kaimo313
用 $1,$2...
来引用要被替换的字符串。
"I am am kaimo not not kaimo313".replace(/\\b(\\w+)\\s\\1/g, 'xxx');
"I am am kaimo not not kaimo313".replace(/\\b(\\w+)\\s\\1/g, '$1');
不想子表达式被引用,可以使用非捕获正则 (?:regex)
这样就可以避免浪费内存。
"kaimo313".replace(/(kaimo)(?:313)/, '$1,$2')
(负)前向查找
前向查找:凡是以 (?=regex)
包含的子表达式在匹配过程中都会用来限制前面的表达式的匹配。
负前向查找:语法 (?!regex)
"kaimo kaimo313".replace(/kaimo(?=313)/, 'xxx');
// 负前向查找
"kaimo kaimo313".replace(/kaimo(?!313)/, 'xxx');
(负)后向查找
后向查找:后向查找(lookbehind)是通过指定一个子表达式,然后从符合这个子表达式的位置出发开始查找符合规则的字串。语法:(?<=regex)
负后向查找:语法:(?<!regex)
可以将字符串进行翻转,然后再使用前向查找,作完处理后再翻转回来。
"kaimo kaimo313kaimo kaimo".replace(/(?<=313)kaimo/, 'xxx');
"kaimo kaimo313kaimo kaimo".replace(/(?<!313)kaimo/, 'xxx');
"kaimo kaimo313kaimo kaimo".replace(/(?<!313)kaimo/g, 'xxx');
回溯查找 | 正则 | 记忆方式 |
---|---|---|
引用 | \\0,\\1,\\2 和 $0, $1, $2 | 转义+数字 |
非捕获组 | (?:) | 引用表达式(()), 本身不被消费(?),引用(😃 |
前向查找 | (?=) | 引用子表达式(()),本身不被消费(?), 正向的查找(=) |
前向负查找 | (?!) | 引用子表达式(()),本身不被消费(?), 负向的查找(!) |
后向查找 | (?<=) | 引用子表达式(()),本身不被消费(?), 后向的(<,开口往后),正的查找(=) |
后向负查找 | (?<!) | 引用子表达式(()),本身不被消费(?), 后向的(<,开口往后),负的查找(!) |
推荐 vscode 插件:any-rule
安装
vscode 应用商店中搜索 any-rule
,安装即可。
使用
方式1:
右键选择 🦕正则大全
方式2:
在代码任意位置输入**@zz**
。
图解正则
每次在 any-rule 中选择正则后会弹出提示, 可点击图解正则
点击后可以看到正则解析:https://regexper.com/
也可以使用正则表达式可视化工具:https://jex.im/regulex/#!flags=&re= 查看正则图解
any-rule 正则大全测试
我们可以打开:https://any86.github.io/any-rule/,我们可以查找到我们需要正则关键字,然后输入去验证。
any-rule 正则大全(已收录 83)
下面的正则大全来自:https://github.com/any86/any-rule
火车车次
/^[GCDZTSPKXLY1-9]\\d1,4$/
手机机身码(IMEI)
/^\\d15,17$/
必须带端口号的网址(或ip)
/^((ht|f)tps?:\\/\\/)?[\\w-]+(\\.[\\w-]+)+:\\d1,5\\/?$/
网址(URL)
/^(((ht|f)tps?):\\/\\/)?([^!@#$%^&*?.\\s-]([^!@#$%^&*?.\\s]0,63[^!@#$%^&*?.\\s])?\\.)+[a-z]2,6\\/?/
统一社会信用代码
/^[0-9A-HJ-NPQRTUWXY]2\\d6[0-9A-HJ-NPQRTUWXY]10$/
统一社会信用代码(宽松匹配)(15位/18位/20位数字/字母)
/^(([0-9A-Za-z]15)|([0-9A-Za-z]18)|([0-9A-Za-z]20))$/
迅雷链接
/^thunderx?:\\/\\/[a-zA-Z\\d]+=$/
ed2k链接(宽松匹配)
/^ed2k:\\/\\/\\|file\\|.+\\|\\/$/
磁力链接(宽松匹配)
/^magnet:\\?xt=urn:btih:[0-9a-fA-F]40,.*$/
子网掩码(不包含 0.0.0.0)
/^(254|252|248|240|224|192|128)\\.0\\.0\\.0|255\\.(254|252|248|240|224|192|128|0)\\.0\\.0|255\\.255\\.(254|252|248|240|224|192|128|0)\\.0|255\\.255\\.255\\.(255|254|252|248|240|224|192|128|0)$/
linux"隐藏文件"路径
/^\\/(?:[^/]+\\/)*\\.[^/]*/
linux文件夹路径
/^\\/(?:[^/]+\\/)*$/
linux文件路径
/^\\/(?:[^/]+\\/)*[^/]+$/
window文件夹路径
/^[a-zA-Z]:\\\\(?:\\w+\\\\?)*$/
window下文件路径
/^[a-zA-Z]:\\\\(?:\\w+\\\\)*\\w+\\.\\w+$/
股票代码(A股)
/^(s[hz]|S[HZ])(000[\\d]3|002[\\d]3|300[\\d]3|600[\\d]3|60[\\d]4)$/
大于等于0, 小于等于150, 支持小数位出现5, 如145.5, 用于判断考卷分数
/^150$|^(?:\\d|[1-9]\\d|1[0-4]\\d)(?:\\.5)?$/
html注释
/<!--[\\s\\S]*?-->/g
md5格式(32位)
/^[a-fA-F0-9]32$/
GUID/UUID
/^[a-f\\d]4(?:[a-f\\d]4-)4[a-f\\d]12$/i
版本号(version)格式必须为X.Y.Z
/^\\d+(?:\\.\\d+)2$/
视频(video)链接地址(视频格式可按需增删)
/^https?:\\/\\/(.+\\/)+.+(\\.(swf|avi|flv|mpg|rm|mov|wav|asf|3gp|mkv|rmvb|mp4))$/i
图片(image)链接地址(图片格式可按需增删)
/^https?:\\/\\/(.+\\/)+.+(\\.(gif|png|jpg|jpeg|webp|svg|psd|bmp|tif))$/i
24小时制时间(HH:mm:ss)
/^(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d$/
12小时制时间(hh:mm:ss)
/^(?:1[0-2]|0?[1-9]):[0-5]\\d:[0-5]\\d$/
base64格式
/^\\s*data:(?:[a-z]+\\/[a-z0-9-+.]+(?:;[a-z-]+=[a-z0-9-]+)?)?(?:;base64)?,([a-z0-9!$&',()*+;=\\-._~:@/?%\\s]*?)\\s*$/i
数字/货币金额(支持负数、千分位分隔符)
/^-?\\d+(,\\d3)*(\\.\\d1,2)?$/
数字/货币金额 (只支持正数、不支持校验千分位分隔符)
/(?:^[1-9]([0-9]+)?(?:\\.[0-9]1,2)?$)|(?:^(?:0)$)|(?:^[0-9]\\.[0-9](?:[0-9])?$)/
银行卡号
/^[1-9]\\d9,29$/
10到30位, 覆盖对公/私账户, 参考微信支付
中文姓名
/^(?:[\\u4e00-\\u9fa5·]2,16)$/
英文姓名
/(^[a-zA-Z][a-zA-Z\\s]0,20[a-zA-Z]$)/
车牌号(新能源)
/^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领][A-HJ-NP-Z](?:((\\d5[A-HJK])|([A-HJK][A-HJ-NP-Z0-9][0-9]4))|[A-HJ-NP-Z0-9]4[A-HJ-NP-Z0-9挂学警港澳])$/
车牌号(非新能源)
/^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领][A-HJ-NP-Z][A-HJ-NP-Z0-9]4[A-HJ-NP-Z0-9挂学警港澳]$/
车牌号(新能源+非新能源)
/^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领][A-HJ-NP-Z][A-HJ-NP-Z0-9]4,5[A-HJ-NP-Z0-9挂学警港澳]$/
手机号(mobile phone)中国(严谨), 根据工信部2019年最新公布的手机号段
/^(?:(?:\\+|00)86)?1(?:(?:3[\\d])|(?:4[5-79])|(?:5[0-35-9])|(?:6[5-7])|(?:7[0-8])|(?:8[\\d])|(?:9[189]))\\d8$/
手机号(mobile phone)中国(宽松), 只要是13,14,15,16,17,18,19开头即可
/^(?:(?:\\+|00)86)?1[3-9]\\d9$/
手机号(mobile phone)中国(最宽松), 只要是1开头即可, 如果你的手机号是用来接收短信, 优先建议选择这一条
/^(?:(?:\\+|00)86)?1\\d10$/
日期(宽松)
/^\\d1,4(-)(1[0-2]|0?[1-9])\\1(0?[1-9]|[1-2]\\d|30|31)$/
日期(严谨, 支持闰年判断)
/^(([0-9]3[1-9]|[0-9]2[1-9][0-9]1|[0-9]1[1-9][0-9]2|[1-9][0-9]3)-(((0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)-(0[1-9]|[12][0-9]|30))|(02-(0[1-9]|[1][0-9]|2[0-8]))))|((([0-9]2)(0[48]|[2468][048]|[13579][26])|((0[48]|[2468][048]|[3579][26])00))-02-29)$/
中国省
/^浙江|上海|北京|天津|重庆|黑龙江|吉林|辽宁|内蒙古|河北|新疆|甘肃|青海|陕西|宁夏|河南|山东|山西|安徽|湖北|湖南|江苏|四川|贵州|云南|广西|西藏|江西|广东|福建|台湾|海南|香港|澳门$/
可以被moment转化成功的时间 YYYYMMDD HH:mm:ss
/^\\d4([/:-\\S])(1[0-2]|0?[1-9])\\1(0?[1-9]|[1-2]\\d|30|31) (?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d$/
email(邮箱)
/^(([^<>()[\\]\\\\.,;:\\s@"]+(\\.[^<>()[\\]\\\\.,;:\\s@"]+)*)|(".+"))@((\\[[0-9]1,3\\.[0-9]1,3\\.[0-9]1,3\\.[0-9]1,3\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]2,))$/
座机(tel phone)电话(国内),如: 0341-86091234
/^(?:(?:\\d3-)?\\d8|^(?:\\d4-)?\\d7,8)(?:-\\d+)?$/
身份证号(1代,15位数字)
/^[1-9]\\d7(?:0\\d|10|11|12)(?:0[1-9]|[1-2][\\d]|30|31)\\d3$/
身份证号(2代,18位数字),最后一位是校验位,可能为数字或字符X
/^[1-9]\\d5(?:18|19|20)\\d2(?:0[1-9]|10|11|12)(?:0[1-9]|[1-2]\\d|30|31)\\d3[\\dXx]$/
身份证号, 支持1/2代(15位/18位数字)
/^\\d6((((((19|20)\\d2)(0[13-9]|1[012])(0[1-9]|[12]\\d|30))|(((19|20)\\d2)(0[13578]|1[02])31)|((19|20)\\d2)02(0[1-9]|1\\d|2[0-8])|((((19|20)([13579][26]|[2468][048]|0[48]))|(2000))0229))\\d3)|((((\\d2)(0[13-9]|1[012])(0[1-9]|[12]\\d|30))|((\\d2)(0[13578]|1[02])31)|((\\d2)02(0[1-9]|1\\d|2[0-8]))|(([13579][26]|[2468][048]|0[048])0229))\\d2))(\\d|X|x)$/
护照(包含香港、澳门)
/(^[EeKkGgDdSsPpHh]\\d8$)|(^(([Ee][a-fA-F])|([DdSsPp][Ee])|([Kk][Jj])|([Mm][Aa])|(1[45]))\\d7$)/
帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线组合
/^[a-zA-Z]\\w4,15$/
中文/汉字
/^(?:[\\u3400-\\u4DB5\\u4E00-\\u9FEA\\uFA0E\\uFA0F\\uFA11\\uFA13\\uFA14\\uFA1F\\uFA21\\uFA23\\uFA24\\uFA27-\\uFA29]|[\\uD840-\\uD868\\uD86A-\\uD86C\\uD86F-\\uD872\\uD874-\\uD879][\\uDC00-\\uDFFF]|\\uD869[\\uDC00-\\uDED6\\uDF00-\\uDFFF]|\\uD86D[\\uDC00-\\uDF34\\uDF40-\\uDFFF]|\\uD86E[\\uDC00-\\uDC1D\\uDC20-\\uDFFF]|\\uD873[\\uDC00-\\uDEA1\\uDEB0-\\uDFFF]|\\uD87A[\\uDC00-\\uDFE0])+$/
小数
/^\\d+\\.\\d+$/
只包含数字
/^\\d+$/
html标签(宽松匹配)
/<(\\w+)[^>]*>(.*?<\\/\\1>)?/
匹配中文汉字和中文标点
/[\\u4e00-\\u9fa5|\\u3002|\\uff1f|\\uff01|\\uff0c|\\u3001|\\uff1b|\\uff1a|\\u201c|\\u201d|\\u2018|\\u2019|\\uff08|\\uff09|\\u300a|\\u300b|\\u3008|\\u3009|\\u3010|\\u3011|\\u300e|\\u300f|\\u300c|\\u300d|\\ufe43|\\ufe44|\\u3014|\\u3015|\\u2026|\\u2014|\\uff5e|\\ufe4f|\\uffe5]/
qq号格式正确
/^[1-9][0-9]4,10$/
数字和字母组成
/^[A-Za-z0-9]+$/
英文字母
/^[a-zA-Z]+$/
小写英文字母组成
/^[a-z]+$/
大写英文字母
/^[A-Z]+$/
密码强度校验,最少6位,包括至少1个大写字母,1个小写字母,1个数字,1个特殊字符
/^\\S*(?=\\S6,)(?=\\S*\\d)(?=\\S*[A-Z])(?=\\S*[a-z])(?=\\S*[!@#$%^&*? ])\\S*$/
用户名校验,4到16位(字母,数字,下划线,减号)
/^[a-zA-Z0-9_-]4,16$/
ip-v4[:端口]
/^((\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])\\.)3(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])(?::(?:[0-9]|[1-9][0-9]1,3|[1-5][0-9]4|6[0-4][0-9]3|65[0-4][0-9]2|655[0-2][0-9]|6553[0-5]))?$/
ip-v6[:端口]
/(^(?:(?:(?:[0-9A-Fa-f]1,4:)7[0-9A-Fa-f]1,4)|(([0-9A-Fa-f]1,4:)6:[0-9A-Fa-f]1,4)|(([0-9A-Fa-f]1,4:)5:([0-9A-Fa-f]1,4:)?[0-9A-Fa-f]1,4)|(([0-9A-Fa-f]1,4:)4:([0-9A-Fa-f]1,4:)0,2[0-9A-Fa-f]1,4)|(([0-9A-Fa-f]1,4:)3:([0-9A-Fa-f]1,4:)0,3[0-9A-Fa-f]1,4)|(([0-9A-Fa-f]1,4:)2:([0-9A-Fa-f]1,4:)0,4[0-9A-Fa-f]1,4)|(([0-9A-Fa-f]1,4:)6((\\b((25[0-5])|(1\\d2)|(2[0-4]\\d)|(\\d1,2))\\b)\\.)3(\\b((25[0-5])|(1\\d2)|(2[0-4]\\d)|(\\d1,2))\\b))|(([0-9A-Fa-f]1,4:)0,5:((\\b((25[0-5])|(1\\d2)|(2[0-4]\\d)|(\\d1,2))\\b)\\.)3(\\b((25[0-5])|(1\\d2)|(2[0-4]\\d)|(\\d1,2))\\b))|(::([0-9A-Fa-f]1,4:)0,5((\\b((25[0-5])|(1\\d2)|(2[0-4]\\d)|(\\d1,2))\\b)\\.)3(\\b((25[0-5])|(1\\d2)|(2[0-4]\\d)|(\\d1,2))\\b))|([0-9A-Fa-f]1,4::([0-9A-Fa-f]1,4:)0,5[0-9A-Fa-f]1,4)|(::([0-9A-Fa-f]1,4:)0,6[0-9A-Fa-f]1,4)|(([0-9A-Fa-f]1,4:)1,7:))$)|(^\\[(?:(?:(?:[0-9A-Fa-f]1,4:)7[0-9A-Fa-f]1,4)|(([0-9A-Fa-f]1,4:)6:[0-9A-Fa-f]1,4)|(([0-9A-Fa-f]1,4:)5:([0-9A-Fa-f]1,4:)?[0-9A-Fa-f]1,4)|(([0-9A-Fa-f]1,4:)4:([0-9A-Fa-f]1,4:)0,2[0-9A-Fa-f]1,4)|(([0-9A-Fa-f]1,4:)3:([0-9A-Fa-f]1,4:)0,3[0-9A-Fa-f]1,4)|(([0-9A-Fa-f]1,4:)2:([0-9A-Fa-f]1,4:)0,4[0-9A-Fa-f]1,4)|(([0-9A-Fa-f]1,4:)6((\\b((25[0-5])|(1\\d2)|(2[0-4]\\d)|(\\d1,2))\\b)\\.)3(\\b((25[0-5])|(1\\d2)|(2[0-4]\\d)|(\\d1,2))\\b))|(([0-9A-Fa-f]1,4:)0,5:((\\b((25[0-5])|(1\\d2)|(2[0-4]\\d)|(\\d1,2))\\b)\\.)3(\\b((25[0-5])|(1\\d2)|(2[0-4]\\d)|(\\d1,2))\\b))|(::([0-9A-Fa-f]1,4:)0,5((\\b((25[0-5])|(1\\d2)|(2[0-4]\\d)|(\\d1,2))\\b)\\.)3(\\b((25[0-5])|(1\\d2)|(2[0-4]\\d)|(\\d1,2))\\b))|([0-9A-Fa-f]1,4::([0-9A-Fa-f]1,4:)0,5[0-9A-Fa-f]1,4)|(::([0-9A-Fa-f]1,4:)0,6[0-9A-Fa-f]1,4)|(([0-9A-Fa-f]1,4:)1,7:))\\](?::(?:[0-9]|[1-9][0-9]1,3|[1-5][0-9]4|6[0-4][0-9]3|65[0-4][0-9]2|655[0-2][0-9]|6553[0-5]))?$)/i
16进制颜色
/^#?([a-fA-F0-9]6|[a-fA-F0-9]3)$/
微信号(wx),6至20位,以字母开头,字母,数字,减号,下划线
/^[a-zA-Z][-_a-zA-Z0-9]5,19$/
邮政编码(中国)
/^(0[1-7]|1[0-356]|2[0-7]|3[0-6]|4[0-7]|5[1-7]|6[1-7]|7[0-5]|8[013-6])\\d4$/
中文和数字
/^((?:[\\u3400-\\u4DB5\\u4E00-\\u9FEA\\uFA0E\\uFA0F\\uFA11\\uFA13\\uFA14\\uFA1F\\uFA21\\uFA23\\uFA24\\uFA27-\\uFA29]|[\\uD840-\\uD868\\uD86A-\\uD86C\\uD86F-\\uD872\\uD874-\\uD879][\\uDC00-\\uDFFF]|\\uD869[\\uDC00-\\uDED6\\uDF00-\\uDFFF]|\\uD86D[\\uDC00-\\uDF34\\uDF40-\\uDFFF]|\\uD86E[\\uDC00-\\uDC1D\\uDC20-\\uDFFF]|\\uD873[\\uDC00-\\uDEA1\\uDEB0-\\uDFFF]|\\uD87A[\\uDC00-\\uDFE0])|(\\d))+$/
不能包含字母
/^[^A-Za-z]*$/
java包名
/^([a-zA-Z_]\\w*)+([.][a-zA-Z_]\\w*)+$/
mac地址
/^((([a-f0-9]2:)5)|(([a-f0-9]2-)5))[a-f0-9]2$/i
匹配连续重复的字符
/(.)\\1+/
数字和英文字母组成,并且同时含有数字和英文字母
/^(?=.*[a-zA-Z])(?=.*\\d).+$/
香港身份证
/^[a-zA-Z]\\d6\\([\\dA]\\)$/
澳门身份证
/^[1|5|7]\\d6\\(\\d\\)$/
台湾身份证
/^[a-zA-Z][0-9]9$/
大写字母,小写字母,数字,特殊符号 @#$%^&*
~()-+=` 中任意3项密码
/^(?![a-zA-Z]+$)(?![A-Z0-9]+$)(?![A-Z\\W_!@#$%^&*`~()-+=]+$)(?![a-z0-9]+$)(?![a-z\\W_!@#$%^&*`~()-+=]+$)(?![0-9\\W_!@#$%^&*`~()-+=]+$)[a-zA-Z0-9\\W_!@#$%^&*`~()-+=]/
ASCII码表中的全部的特殊字符
/[\\x21-\\x2F\\x3A-\\x40\\x5B-\\x60\\x7B-\\x7E]+/
正整数,不包含0
/^\\+?[1-9]\\d*$/
负整数,不包含0
/^-[1-9]\\d*$/
整数
/^(?:0|(?:-?[1-9]\\d*))$/
浮点数
/^(-?[1-9]\\d*\\.\\d+|-?0\\.\\d*[1-9]\\d*|0\\.0+)$/
浮点数(严格)
/^(-?[1-9]\\d*\\.\\d+|-?0\\.\\d*[1-9])$/
email(支持中文邮箱)
/^[A-Za-z0-9\\u4e00-\\u9fa5]+@[a-zA-Z0-9_-]+(\\.[a-zA-Z0-9_-]+)+$/
域名(非网址, 不包含协议)
/^([0-9a-zA-Z-]1,\\.)+([a-zA-Z]2,)$/
参考资料
以上是关于常用正则大全的主要内容,如果未能解决你的问题,请参考以下文章
急求js正则表达式,要求只能输入数字和减号,不能输入其他任何字母或特殊字符,但是减号只能在数字的开