[转]js 正则表达式

时间:2022-04-27 04:39:51

一、正则表达式中包括的元素

1、原子(普通字符:a-z A-Z 0-9 、原子表、 转义字符)

2、元字符 (有特殊功能的字符)

3、模式修正符 (系统内置部分字符 i 、m、S、U…)

二、正则表达式中的“原子”

1、a-z A-Z _ 0-9  //最常见的字符

2、(abc) (skd)  //用圆括号包含起来的单元符合,匹配整体

3、[abcs] [^abd] //用方括号包含的原子表,匹配任意一个字符,原子表中的^代表排除或相反内容

4、转义字符

\d  包含所有数字[0-9]

\D  除所有数字外[^0-9]

\w  包含所有英文字符[a-zA-Z_0-9]

\W  除所有英文字符外[^a-zA-Z_0-9]
  \s   包含空白区域如回车、换行、分页等 [\f\n\r]

三、模式修正符

0、g 匹配所有符合条件

1、i 正则内容在匹配时候不区分大小写(默认是区分的)

2、m 在匹配首内容或者尾内容时候采用多行识别匹配

如:$preg = “/^a/m”; $str =”bb\naa”;可以匹配第二行a,$str双引号

3、s 将转义回车取消是为单行匹配如.( 匹配除换行符 \n之外的任何单字符) 匹配的时候,可以忽略\n

4、x 忽略正则中的空白

5、A 强制从头开始匹配(第一行)

6、D 强制$匹配尾部无任何内容如:匹配到\n之后

7、U 禁止贪婪匹配 只跟踪到最近的一个匹配符并结束,

常用在采集程序上的正则表达式

如:$str="<a><c>"; $preg 01= ‘/<(.*)>/U’; 和 $preg02 = ‘/<.*?>/’; 结果都为:a

8、$str = ‘2009-01-01\2010\01-01’; $preg = ‘/2009(.*?)01\\1(01)(.*?)2010\\3(01)\\1(01)/’;

//1、//2、//3代表内存中第几个匹配过的内容

//js 正则表达式  汉字 匹配

1、在破解版调试模式下,正则表达式会出现错误匹配,应将其编译在EXE文件再看运行结果

2、暂时用到的正则表达式串:

^(\()?(一|二|三|四|五|六|七|八|九|十|[0-9]{1,4})(\))?(?!○)所有段落总纲 ,注意此处 句首符^非常宽松的匹配,只要在首句内都可匹配(如果去掉{1,4}试试便如此)
(?<=被查单位名称).+?(?= 经济性质)
[\一-\?]+ 非汉字
[\xb0-\xf7][\xa0-\xfe]  汉字
[^\xb0-\xf7][^\xa0-\xfe]  非汉字
([^\xB0-\xf7].)*  非汉字 更准确
(?<=被查单位名称
 )([\xB0-\xf7][\xA1-\xFE])+  取得被查单位名称后所表明的单位名称
(?<=被查单位名称
 )([\xB0-\xf7].)+
(?<=被查单位名称([^\xB0-\xf7].))([\xB0-\xf7].)+ 最优解
(?<=被查单位名称([-?]{2}))[^-?]+     最最优解    (?<=被查单位名称.{2})[^-?]+
(?<=检查类型([-?]{2}))[^-?]+
([^-?][^-?])+

(?<=检查实施时间([-?]{2}))20\d{2}\.1?\d.[123]?\d

20\d{2}年1?\d月[123]?\d日至20\d{2}年1?\d月[123]?\d日(?=的纳税情况)   稽查所属期限

(?<=地方教育发展费)[^\d]{0,2}\d+.?\d{0,2}  地方教育发展费 带冒号

(?<=纳税人基本情况).+?(?=(\s.{0,30}发现的问题))  取纳税人基本情况三段内容,看样子回车符也匹配空白符\s
(?<=纳税人基本情况).+?(?=二)

(?<=(一)发现的问题).+?(?=(二))

(?<=年度$).+(?=\s.{4,8}年度$)  取得2007年度的违法事实

\x20  稽查报告在处理之前先得用此将空格去除
.子程序 子_全文替换, 文本型, , 这是简单的正则表达式搜索代码,你可以根据需要进行改进。
.参数 欲被替换文本, 文本型
.局部变量 正则表达式, 正则表达式

正则表达式.创建 ("\x20", )
返回 (正则表达式.替换 (欲被替换文本, "", 1, , 真, 真))

要去掉段尾的标点符号,去除缴纳改为缴 为方便搜索  改二00八年度为2008年度

(?<=应....地方教育发展费).+?[元,,]     []也可当作右方向预搜索用 经检验,可当右预搜索的观点是错的,它只能当作2个单字节用

(?<=地方教育发展费|费:).+?(?=元|,|,)

^(\()?(一|二|三|四|五|六|七|八|九|十|[0-9])(\))?(、?)?(?=[\xaa-\xf7]|20)    大编号

严重观注: \d也会在易语言中匹配汉字某一半边

3、']' 字符如果不是第一项,则将结束一个列表。要在列表中匹配 ']' 字符,请将其放在第一项,紧跟在开始的 '[' 后面。

'\' 仍然作为转义符。要匹配 '\' 字符,请使用 '\\'。 
如果想在方括号表达式中包括连字符,则必须使用下述方法之一:

使用反斜杠将其转义: 
[\-]
将连字符放在括号列表的开始和结束位置。下面的表达式能匹配所有的小写字母和连字符: 
[-a-z]
[a-z-]
创建一个范围,其中开始字符的值小于连字符,而结束字符的值等于或大于连字符。下面两个正则表达式都满足这一要求: 
[!--]
[!-~]
同样,通过在列表开始处放置一个插入符(^),就可以查找所有不在列表或范围中的字符。如果该插入符出现在列表的其他位置,则匹配其本身,没有任何特殊含义
你可能认为下面的 JScript 和 VBScript 表达式将匹配位于一行的开始和结束位置且后跟一个或两个数字的 'Chapter' 或 'Section':/^Chapter|Section [1-9][0-9]{0,1}$/
"^Chapter|Section [1-9][0-9]{0,1}$"不幸的是,真正的情况是上面所示的正则表达式要么匹配位于一行开始处的单词 'Chapter',要么匹配一行结束处的后跟任何数字的 'Section'。如果输入字符串为 'Chapter 22',上面的表达式将只匹配单词 'Chapter'。如果输入字符串为 'Section 22',则该表达式将匹配 'Section 22'。但这种结果不是我们此处的目的,因此必须有一种办法来使正则表达式对于所要做的更易于响应,而且确实也有这种方法。可以使用圆括号来限制选择的范围,也就是说明确该选择只适用于这两个单词 'Chapter' 和 'Section'。不过,圆括号同样也是难处理的,因为它们也用来创建子表达式,有些内容将在后面关于子表达式的部分介绍。通过采用上面所示的正则表达式并在适当位置添加圆括号,就可以使该正则表达式既可以匹配 'Chapter 1',也可以匹配 'Section 3'。下面的正则表达式使用圆括号将 'Chapter' 和 'Section' 组成一组,所以该表达式才能正确工作。对 JScript 为:/^(Chapter|Section) [1-9][0-9]{0,1}$/对 VBScript 为:"^(Chapter|Section) [1-9][0-9]{0,1}$"
可以在正则表达式模式圆括号内部的前面使用 '?:'来防止存储该匹配供今后使用。对上面所示正则表达式的下述修改提供了免除子匹配存储的相同功能。对 JScript:/^(?:Chapter|Section) [1-9][0-9]{0,1}$/对 VBScript:"^(?:Chapter|Section) [1-9][0-9]{0,1}$"
a(b(?i)c)d 增加 i - IGNORECASE 模式,只对 c 起作用。表达式可以匹配 "abcd" 和 "abCd" 
 非捕获组 (?:xxx)
表达式 方向 说明 (?=xxx) 正向预搜索(向右) 正向预搜索,判断当前位置右侧是否能匹配指定表达式 (?!xxx) 正向预搜索否定,判断当前位置右侧是否不能够匹配指定表达式 (?<=xxx) 反向预搜索(向左) 反向预搜索,判断当前位置左侧是否能够匹配指定表达式 (?<!xxx) 反向预搜索否定,判断当前位置左侧是否不能够匹配指定表达式 记住,所有预搜索在易语言中必须是固定长数
独立表达式 (?>pattern)独立表达式所匹配的内容,与将它单独匹配时匹配的内容一致。不管之后的表达式是否匹配成功,独立表达式内部都不进行回退,都不会再次尝试匹配
条件表达式根据某个条件是否成立,来选择匹配 2 个可选表达式中的其中一个。--------------------------------------------------------------------------------说明可以用于条件表达式的条件有两种类型:指定分组(group)是否进行了捕获。 文本中当前位置是否可以与指定表达式匹配。 条件表达式的格式及说明:表达式 条件特点 条件说明 (?(1)yes|no) 条件为数字 分组1如果有捕获,则进行 yes 部分匹配,否则 no 部分 (?(?=a)aa|bbb) 条件为预搜索 如果当前位置右侧是 a,则进行匹配 aa,否则匹配 bbb (?(xxx)aa|bbb) 不与分组命名吻合 如果不与任何分组命名吻合,则视为 (?=xxx) 相同 (?(name)yes|no) 与分组命名吻合 如果与某分组命名吻合,则视为判断该分组是否进行捕获 另外:如果表达式为 RIGHTTOLEFT 模式,那么 (?(xxx)aa|bbb) 与 (?(?<=xxx)aa|bbb) 相同。 如果条件表达式只有一个选择项,那么这个选项是在条件成立时进行匹配。 如果条件表达式中,使用“|”进行分隔的选项多于2个,则只有第一个“|”被视为条件表达式选项分隔符。比如: (?(?=xxx)yes|no1|no2),条件成立时,匹配 yes 部分,否则匹配 "no1|no2"。