# 表达式和编码

# Flag

各种表达式以及编码

# 进制

进制 英文 范围 前缀 后缀
二进制 Binary 0-1 0b B
八进制 Octal 0-7 0/0O O
十进制 Decimal 0-9 D
十六进制 Hexadecimal 0-9, A-F 0x H

# 逻辑运算符

运算符 说明
AND 与(&&)
NOT 非(!)
OR 或(||)
EQ EQUAL等于(==)
NE NOT EQUAL不等于(!=)
GT GREATER THAN大于(>)
GE GREATER THAN OR EQUAL 大于等于(>=)
LT LESS THAN小于(<)
LE LESS THAN OR EQUAL 小于等于(<=)

# 字符集编码

# Unicode

Unicode 意义
u0024 $
u0028 (
u0029 )
u002A *
u002B +
u002E .
u003F ?
u005B [
u005C \
u005E ^
u007B {
u007C |
u007D }
u0009 t
u000A n
u000D r
u0022 "
u002C ,
u003A :
  • GBK、GB2312等与UTF8之间都必须通过Unicode编码才能相互转换
    • GBK、GB2312 -> Unicode -> UTF8
    • UTF8 -> Unicode -> GBK、GB2312

Unicode TransformationFormat-8bit,允许含BOM,但通常不含BOM。是用以解决国际上字符的一种多字节编码, 它对英文使用8位(即一个字节),中文使用24为(三个字节)来编码。UTF-8包含全世界所有国家需要用到的字符,是国际编码,通用性强。

GBK是国家标准GB2312基础上扩容后兼容GB2312的标准。GBK的文字编码是用双字节来表示的,即不论中、英文字符均使用双字节来表示, 为了区分中文,将其最高位都设定成1。GBK包含全部中文字符,是国家编码,通用性比UTF8差,不过UTF8占用的数据库比GBK大。

零宽度字符/零宽字符

零宽度字符是一些不可见的,不可打印的字符。

不可见且不占位置字符:\u200D\u202A\u202B\u202C\u202D\u202E\u2060\u2061\u2062\u2063\u2064\u2065\u206A\u206B\u206C\u206D\u206E\u206F

  • 零宽度空格符 (zero-width space) U+200B : 用于较长单词的换行分隔
  • 零宽度非断空格符 (zero width no-break space) U+FEFF : 用于阻止特定位置的换行分隔
  • 零宽度连字符 (zero-width joiner) U+200D : 用于阿拉伯文与印度语系等文字中,使不会发生连字的字符间产生连字效果
  • 零宽度断字符 (zero-width non-joiner) U+200C : 用于阿拉伯文,德文,印度语系等文字中,阻止会发生连字的字符间的连字效果
  • 左至右符 (left-to-right mark) U+200E : 用于在混合文字方向的多种语言文本中(例:混合左至右书写的英语与右至左书写的希伯来语),规定排版文字书写方向为左至右
  • 右至左符 (right-to-left mark) U+200F : 用于在混合文字方向的多种语言文本中,规定排版文字书写方向为右至左

# ASCII

ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)是基于拉丁字母的一套电脑编码系统 ,是一种字符代码(UTF-8的子集),为使计算机支持更多语言,通常使用 0x00~0x7f 范围的1 个字节来表示 1 个英文字符。 超出此范围的使用0x80~0xFFFF来编码,即扩展的ASCII编码

ASCII字符集由95个可打印字符(0x20-0x7E)(可见字符)和33个控制字符(0x00-0x1F,0x7F)(不可见字符)组成

Windows下ASCII(ANSI) Windows 记事本的 ANSI、Unicode、UTF-8 这三种编码模式有什么区别? (opens new window)

  • ASCII基本字符为:0~127,共128个
    • ASCII控制字符为:0~31,共32个
    • ASCII可显示字符为:32~127,共96个
      • 数字0~9对应的ASCII码(十进制)为:48~57
      • 大写字母A~Z对应的ASCII码(十进制)为:65~90
      • 小写字母a~z对应的百ASCII码(十进制)为:97~122
      • 其他为各种符号:33~4758~6491~96123~127`
  • ASCII扩展字符为:128~255,共128个

# Cron表达式

  • 特殊符
  1. * 每一(每一分)
  2. ? 表示不关心,任意
  3. - 范围 (小时:1-12,1到12点运行)
  4. , 标示多个值 (小时 1,2,3 1点2点3点运行)
  5. / 递增触发(0/15,从0开始每15秒运行一次)
  6. L 最后(日L,当月最后一天,周L周六)
  7. W 指定日期最近的工作日(周一到周五)
  8. ## 序号(表示每月的第几个周几)
  • CronTrigger配置格式: [秒] [分] [小时] [日] [月] [周] [年]
序号 说明 是否必填 允许填写的值 允许的通配符
1 0-59 , - * /
2 0-59 , - * /
3 小时 0-23 , - * /
4 1-31 , - * ? / L W
5 1-12 or JAN-DEC , - * /
6 1-7 or SUN-SAT , - * ? / L ##
7 empty或1970-2099 , - * /

# Glob通配符

glob(man 7 glob/GLOB(7))是shell使用的路径通配符,类似于正则表达式,但是与正则表达式不完全相同

glob非常强大的用途在于路径匹配,大部分的平台和开发语言都会在配置中使用glob路径匹配,其普遍性几乎使其成为一种标准。 但是需注意的是,每个平台和开发语言所支持glob路径匹配可能不完全一样。

  • *:匹配一个路径部分中0个或多个字符,注意不匹配以.开始的路径,如文件.a。
  • ?:匹配一个字符。
  • […]:匹配一系列字符,如[abc]匹配字符a, b, c,在[^…]和[!…]表示匹配不在列表中的字符,如[^abc]匹配除了a, b, c以外的字符。
  • **:匹配0个或多个子文件夹。
  • {a,b}:匹配a或则b,a和b也是通配符,可以由其他通配符组成。
  • !:排除文件,如!a.js表示排除文件a.js。

# 正则表达式

# 正则转义

  • Escape Sequence
转义字符 意义
\' 代表一个单引号(撇号)字符
\" 代表一个双引号字符
\\ 代表一个反斜线字符\
\0 空字符(NULL)
\b 退格(BS) ,将当前位置移到前一列
\b 一个单词的边界
\B 一个非单词的边界
\d 数字 等价于 [0-9]
\D 非数字 等价于 [^0-9]
\ddd 1到3位八进制数所代表的任意字符
\e Escape
\f 换页(FF),将当前位置移到下页开头
\f 换页符
\G 前一个匹配的结束
\n 换行(LF) ,将当前位置移到下一行开头
\r 回车(CR) ,将当前位置移到本行开头
\s 空白符号 [\t\n\x0B\f\r]
\S 非空白符号 [^\t\n\x0B\f\r]
\t 水平制表(HT) (跳到下一个TAB位置)
\uhhhh 1到2位十六进制所代表的任意字符
\v 垂直制表(VT)
\w 单独字符 [a-zA-Z_0-9]
\W 非单独字符 [^a-zA-Z_0-9]

# 正则模式

模式 描述
^ 匹配字符串的开头
$ 匹配字符串的末尾。
. 匹配任意字符,除了换行符,当re.DOTALL标记被指定时,则可以匹配包括换行符的任意字符。
[...] 用来表示一组字符,单独列出:[amk] 匹配 'a','m'或'k'
[^...] 不在[]中的字符:[^abc] 匹配除了a,b,c之外的字符。
re* 匹配0个或多个的表达式。
re+ 匹配1个或多个的表达式。
re? 匹配0个或1个由前面的正则表达式定义的片段,非贪婪方式
re{ n} 匹配n个前面表达式。例如,"o{2}"不能匹配"Bob"中的"o",但是能匹配"food"中的两个o。
re{ n,} 精确匹配n个前面表达式。例如,"o{2,}"不能匹配"Bob"中的"o",但能匹配"foooood"中的所有o。"o{1,}"等价于"o+"。"o{0,}"则等价于"o*"。
re{ n, m} 匹配 n 到 m 次由前面的正则表达式定义的片段,贪婪方式
a b
(re) 匹配括号内的表达式,也表示一个组
(?imx) 正则表达式包含三种可选标志:i, m, 或 x 。只影响括号中的区域。
(?-imx) 正则表达式关闭 i, m, 或 x 可选标志。只影响括号中的区域。
(?: re) 类似 (...), 但是不表示一个组
(?imx: re) 在括号中使用i, m, 或 x 可选标志
(?-imx: re) 在括号中不使用i, m, 或 x 可选标志
(?#...) 注释.
(?= re) 前向肯定界定符。如果所含正则表达式,以 ... 表示,在当前位置成功匹配时成功,否则失败。但一旦所含表达式已经尝试,匹配引擎根本没有提高;模式的剩余部分还要尝试界定符的右边。
(?! re) 前向否定界定符。与肯定界定符相反;当所含表达式不能在字符串当前位置匹配时成功。
(?> re) 匹配的独立模式,省去回溯。
(?P名称) 分组起别名
(?P=name) 引用别名为name分组匹配到的字符串
\w 匹配数字字母下划线
\W 匹配非数字字母下划线
\s 匹配任意空白字符,等价于 [\t\n\r\f]。
\S 匹配任意非空字符
\d 匹配任意数字,等价于 [0-9]。
\D 匹配任意非数字
\A 匹配字符串开始
\Z 匹配字符串结束,如果是存在换行,只匹配到换行前的结束字符串。
\z 匹配字符串结束
\G 匹配最后匹配完成的位置。
\b 匹配一个单词边界,也就是指单词和空格间的位置。例如, 'er\b' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'。
\B 匹配非单词边界。'er\B' 能匹配 "verb" 中的 'er',但不能匹配 "never" 中的 'er'。
\n, \t 匹配一个换行符。匹配一个制表符
\1...\9 匹配第n个分组的内容。
\10 匹配第n个分组的内容,如果它经匹配。否则指的是八进制字符码的表达式。

# 正则使用

$1\1匹配获取到的值

  • .*关键字.*\r\n 指定关键字的行
  • ^(.*?)$\s+?^(?=.*^\1$) 重复行
  • 关键字之后(包含关键字本身)的所有字符
    • (关键字)(.*?$)
    • 关键字.*$
    • (关键字)([^关键字]*$)
  • 关键字之前(包含关键字本身)的所有字符
    • ^([^关键字]*)关键字
    • ^.*关键字
    • (^.*?)关键字
  • (^.*?关键字.*?)关键字 每行中的第二个关键字之前(包含关键字本身)的所有字符
  • 查找目标^[^\n]*\n([^\n]*) 替换为\1 隔行删除
  • 匹配不是空行的行尾:(?!^$)(\n)
  • 匹配Markdown文档
    • 当页跳转链接(锚点)(\[)(.*)(\]\(#)(.*)(\))取值$4
    • 外链(\[)(.*)(\]\()(.*)(\))取值$4
// 匹配字母、数字及所有英文符号
/^[a-z_A-Z0-9-\.!@#\$%\\\^&\*\)\(\+=\{\}\[\]\/",'<>~\·`\?:;|]+$/

// 用户名正则,4到16位(字母,数字,下划线,减号)
var uPattern = /^[a-zA-Z0-9_-]{4,16}$/;
// 输出 true
console.log(uPattern.test("iFat3"));
//密码强度正则,最少6位,包括至少1个大写字母,1个小写字母,1个数字,1个特殊字符
var pPattern = /^.*(?=.{6,})(?=.*\d)(?=.*[A-Z])(?=.*[a-z])(?=.*[!@#$%^&*? ]).*$/;
//输出 true
console.log("=="+pPattern.test("iFat3#"));
//正整数正则
var posPattern = /^\d+$/;
//负整数正则
var negPattern = /^-\d+$/;
//整数正则
var intPattern = /^-?\d+$/;
//输出 true
console.log(posPattern.test("42"));
//输出 true
console.log(negPattern.test("-42"));
//输出 true
console.log(intPattern.test("-42"));
// 数字正则
// 可以是整数也可以是浮点数

//正数正则
var posPattern = /^\d*\.?\d+$/;
//负数正则
var negPattern = /^-\d*\.?\d+$/;
//数字正则
var numPattern = /^-?\d*\.?\d+$/;
console.log(posPattern.test("42.2"));
console.log(negPattern.test("-42.2"));
console.log(numPattern.test("-42.2"));
//Email正则:
var ePattern = /^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$/;
var ePattern = /^[a-z0-9A-Z]+[-|a-z0-9A-Z._]+@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\\.)+[a-z]{2,}$/;
// 使用new RegExp()时\, 要变成\双斜线
var reg = new RegExp("^[a-z0-9A-Z]+[-|a-z0-9A-Z._]+@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\\.)+[a-z]{2,}$");
console.log(/^([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+@([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+\.[a-zA-Z]{2,3}$/.test("[email protected]"));
const rePass = new RegExp('^([a-zA-Z0-9]+[_|\\_|\\.]?)*[a-zA-Z0-9]+@([a-zA-Z0-9]+[_|\\_|\\.]?)*[a-zA-Z0-9]+\\.[a-zA-Z]{2,3}$', '');
// 只允许英文字母、数字、下划线、英文句号、以及中划线组成
var ePattern = /^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$/;
// 名称允许汉字、字母、数字,域名只允许英文域名
var ePattern = /^[A-Za-z0-9\u4e00-\u9fa5]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$/;
//输出 true
console.log(ePattern.test("[email protected]"));
//手机号正则
var mPattern = /^[1][3][0-9]{9}$/;
//输出 true
console.log(mPattern.test("13900000000"));
//身份证号(18位)正则
var cP = /^[1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/;
//输出 true
console.log(cP.test("11010519880605371X"));
// URL正则
var urlP= /^((https?|ftp|file):\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?$/;
// 输出 true
console.log(urlP.test("http://42du.cn"));
// ipv4地址正则
var ipP = /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/;
// 输出 true
console.log(ipP.test("115.28.47.26"));
// 十六进制颜色正则
// RGB Hex颜色正则
var cPattern = /^#?([a-fA-F0-9]{6}|[a-fA-F0-9]{3})$/;
// 输出 true
console.log(cPattern.test("#b8b8b8"));
// 日期正则,简单判定,未做月份及日期的判定
var dP1 = /^\d{4}(\-)\d{1,2}\1\d{1,2}$/;
// 输出 true
console.log(dP1.test("2017-05-11"));
// 输出 true
console.log(dP1.test("2017-15-11"));
// 日期正则,复杂判定
var dP2 = /^(?:(?!0000)[0-9]{4}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-8])|(?:0[13-9]|1[0-2])-(?:29|30)|(?:0[13578]|1[02])-31)|(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:0[48]|[2468][048]|[13579][26])00)-02-29)$/;
// 输出 true
console.log(dP2.test("2017-02-11"));
// 输出 false
console.log(dP2.test("2017-15-11"));
// 输出 false
console.log(dP2.test("2017-02-29"));
// QQ号正则,5至11位
var qqPattern = /^[1-9][0-9]{4,10}$/;
// 输出 true
console.log(qqPattern.test("65974040"));
// 微信号正则,6至20位,以字母开头,字母,数字,减号,下划线
var wxPattern = /^[a-zA-Z]([-_a-zA-Z0-9]{5,19})+$/;
// 输出 true
console.log(wxPattern.test("RuilongMao"));
// 车牌号正则
var cPattern = /^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}[A-Z0-9]{4}[A-Z0-9挂学警港澳]{1}$/;
// 输出 true
console.log(cPattern.test("京K39006"));
// 包含中文正则
var cnPattern = /[\u4E00-\u9FA5]/;
// 输出 true
console.log(cnPattern.test("42度"));
 
Regex_Phones: /^[0-9],$/, // 数字和逗号
Regex_Ident: /^([a-zA-Z0-9]){1,50}$/, //英文、数字且不能包含英文标点和特殊符号(渠道标识)
Regex_IdentName: /^([\u2E80-\u9FFF]|[a-zA-Z0-9]){1,50}$/, //中文、英文、数字且不能包含英文标点和特殊符号(渠道名称)
Regex_MondyNum: /^\d+(\.\d{1,2})?$/, //金额,允许两位小数
Regex_MondyCh: /^[\u4e00-\u9fa5]+$/, //只能为中文
Regex_PhoneNum: /(^(([0\+]\d{2,3}-)?(0\d{2,3})-)(\d{7,8})(-(\d{3,}))?$)|(^0{0,1}1[3|4|5|6|7|8|9][0-9]{9}$)/, //电话号码和手机
Regex_ZNum: /^[1-9]\d*$/ //正整数
Regex_Name: /^[a-zA-Z][a-zA-Z0-9_@]{0,30}$/, // 用户名
Regex_NickName: /^[\u4E00-\u9FA5A-Za-z0-9_\-]+$/, // 中文/英文/数字, (昵称、组名、朋友备注名、内容名称、书名、页名) 
Regex_Passport: /^1[45][0-9]{7}$|G[0-9]{8}$|P\.[0-9]{7}$|S[0-9]{7,8}$|D[0-9]{7,8}$/, // 护照
Regex_BizLience: /^([0-9a-zA-Z]{18}$|\d{15}$)/, // 营业执照,三证合一的是18位
Regex_isExitZh:/[\u4E00-\u9FA5\uF900-\uFA2D]/, // 验证是否存在中文
Regex_price:/^\d+(\.\d{1,2})?$/ // 数字 . 最多两位有效数字
Regex_EnghlishNum:/^(?=.*\d)(?=.*[a-z])[a-zA-Z\d]{6,20}$/ //6至20位英文和数字组合
Regex_Phone: /^0?(13[0-9]|15[012356789]|18[0-9]|14[57])[0-9]{8}$/, // 手机号
Regex_Mobile: /^0?(13[0-9]|15[012356789]|18[0-9]|14[57])[0-9]{8}$/, // 手机号
Regex_Card: /\\d{14}[[0-9],0-9xX]/, // 身份证号 
Regex_Email: /^[a-zA-Z0-9]+([._\\-]*[a-zA-Z0-9])*@([a-zA-Z0-9]+[-a-zA-Z0-9]*[a-zA-Z0-9]+.){1,63}[a-zA-Z0-9]+$/, // 邮箱
Regex_RealName: /^[a-zA-Z\u4e00-\u9fa5]{0,}$/, // 真实姓名、朋友昵称、朋友全称、组名称、组标签
Regex_text: /^[\u4e00-\u9fa5]{0,}$/, // 地区 、省份、城市
Regex_NumPeriod:/^[\d]+.+。/, //数字开头,句号结尾 

Regex_NumFloat:/^(\-|\+)?\d+(\.\d+)?$/, //正负数字
function isUrL(url) {
    var sRegex = '^((https|http|ftp|rtsp|mms)?://)' + '?(([0-9a-z_!~*\'().&=+$%-]+: )?[0-9a-z_!~*\'().&=+$%-]+@)?' //ftp的user@ 
        + '(([0-9]{1,3}.){3}[0-9]{1,3}' // IP形式的URL- 199.194.52.184 
        + '|' // 允许IP和DOMAIN(域名) 
        + '([0-9a-z_!~*\'()-]+.)*' // 域名- www. 
        + '([0-9a-z][0-9a-z-]{0,61})?[0-9a-z].' // 二级域名 
        + '[a-z]{2,6})' // first level domain- .com or .museum 
        + '(:[0-9]{1,4})?' // 端口- :80 
        + '((/?)|' // a slash isn't required if there is no file name 
        + '(/[0-9a-z_!~*\'().;?:@&=+$,%#-]+)+/?)$';
    var re = new RegExp(sRegex);
    //re.test() 
    if (re.test(url)) {
        return true;
    }
    return false;
}