作者: houlijiang

  • 肝豆病程的演变以及初期确诊的肝豆儿童特征

    v2-c46605db8321ff0bab97c2553fc0efad_1440w

    以上是肝豆状核变性患者病情演变从发病常常经历四个病理时期:症状前期(无症状)、肝脏累及期(表现转氨酶升高、黄疸、脂肪肝、早期肝纤维化等)、肝外转移期(表现肝硬化、脑症状、精神症状、腎脏损害、K-F环出现、骨骼损害等)、终末期(表现肝衰竭、大量腹水、消化道出血、扭转痉挛、肝性昏迷、肾脏衰竭等)。

    (二)初期确诊肝豆儿童的特征

    儿童肝豆初期确诊临床表现基本都是症状前期(无症状)或肝脏累及期,是指常规体检发现转氨酶增高、肝脾肿大或脂肪肝,但无临床神经症状。(无症状患者也见于 WD 先证者的一级亲属经ATP7B 基因筛查时确诊。)应注意的是,儿童或青少年 WD 患者的最早期表现常为轻到中度脂肪肝、胆固醇高、甘油三酯、血脂高等,这些症状并不是肝豆病该有的表现,而是铜过多引起的代谢紊乱,应及时采取排铜治疗。WD初期患者铜过多还可以引起肾脏、骨关节等其他器官组织损害。肾损伤以肾小管损伤为主,表现尿蛋白潜血等症状。

    需要注意的是:病情在症状前期、肝脏累及期是该病最佳治疗期,这个阶段只要好好规范治疗定期评估,预防为主,做到科学忌口,对症用药,绝对不会出现任何加重情况,肝豆病人本身的肝脏功能是正常的健全的,肝豆儿童因发病轻通过早期治疗是具备完全正常能力的,肝豆病仅是铜代谢障碍病,其他功能完全正常。

  • 成人肝豆与肝豆儿童有区别没?

    那么成人肝豆病与儿童又有什么区别呢,其实是一样的,成人也是铜代谢障碍病,但成人往往是已经造成个损伤,出现个症状:肝硬化肝腹水就是已经造成了肝脏的问题,已经是肝病了,而脑症状出现就是这些病人属于神经内科的疾病了,他们除了治疗肝豆病还要对应的病症进行治疗改善。所以他们成人有症状的病人口中的肝豆病并非只是简单的代谢病,而是已经造成的并发症。所以我们会听到很多关于肝豆病的各种奇葩言论,这些都不属于肝豆病本身的问题,我们这些儿童肝豆病就记住一点,肝豆病是铜代谢障碍病,就够了。关于肝豆病的各种症状,我们可以简单的了解一下,但没必要去深入研究,因为你们只要控制住源头,把基础做好了,就不存在病变加重的情况。 再补充一点就是关于排铜药,并不是我们现在年龄小不适宜排铜水,等长大了再去用,而是我们青霉胺排铜,已经保持了体内低铜的状态,不存在长期的续积,也不存在长大了铜多,因为我们的治疗是从小就控制铜的,永远长期保持低铜状态,所以永远不会加重,大家一定要有信心,即使没有完全治愈的基因药,以我们现在的治疗,依然可以保证完全健康

  • 肝豆病它可怕吗

    肝豆病是铜代谢障碍病,最简单的说就是代谢病,而它的本质就是铜代谢异常。 铜不能正常排出导致的大量的铜沉积,而引发了 肝脏,脑神经,肾脏等的损伤及病变。我们初次接触肝豆病在百度,在成人肝豆群见到的各种所谓肝豆病的症状:脂肪肝,纤维化,肝硬化,肝腹水,神经症状的手抖、步伐不稳、口齿不清、流口水、吞咽困难等,甚至精神症状如情绪不稳、忧郁、躁狂等。导致我们认为肝豆病就是神经内科病,就是肝脏疾病,就是精神病,但其实我们应该清晰的认识到,这些是因为铜多,铜中毒导致的各种损伤各种症状,是继发性的结果而并非是原发性的,这个是导致我们很多家长对肝豆病的理解有误,认为迟早会加重,不可控的根本原因,以上是肝豆病的本质:铜代谢障碍病。 那么我们既然知道了肝豆病就是铜不能正常的排出,当然也就知道如何控制这个病了。首先我们饮食方面忌口(科学忌口),吃锌(锌有抑制铜吸收的作用),这两项措施都是从入口减少铜的摄入,吃的铜少,必然就吸收的少,也就减缓铜沉积了,但只是减少摄入,延缓沉积,依然不能完全阻止铜的续积,那么我们就要采取排铜药(首选青霉胺)将体内多余的铜排出,我们肝豆病人自身排铜能力差,那么就需要借助药物往外排,永远保持体内的铜不多,就不会造成任何的器官损伤,肝豆病人如果体内长期保持铜不高的状态,体内铜不多就跟正常人完全无异,就不存在任何肝豆病的并发症,这个道理大家应该都能理解。 刚才说了肝豆病就是铜代谢障碍,我们忌口吃锌,铜多就排,铜少亦可恢复单锌治疗,那么长期保持良好的状态,定期复查尿铜,复查身体指标,身体就能永远保持健康状态,而与正常人相比,我们仅是进行相应忌口,以及吃一些药物,这就是与正常人的最大区别,学习工作婚姻等都与正常人完全无异,就是正常的生活。所以大家一定要积极的正确的引导孩子,肝豆病不可怕,一样拥有美好的未来。

  • 免费的异地组网神器Docker搭建教程-ZeroTiger

    v2-51c5c3590efa6bfbc4f4db36053da73c_1440w

    ZeroTiger是一个国外的服务商所提供的基于P2P的组网方案,它可以通过软件的形式实现将我们需要组网的设备加入到一个虚拟的局域网中,从而实现数据的交换。

    组网逻辑:

    1.组网设备接入Zerotier,并通过ID加入指定的虚拟网络。

    2.当设备之间发生数据交换时,网络调度设备间尝试P2P直连。

    3.失败时,从网络中寻找moon服务器作为中转。

    我们使用自己的云服务自建Moon服务器加入Zerotier网络,当P2P失败时,数据始终通过我们自建的私有根服务器作为中转。私有网络需要认证才可以加入,具有一定的安全性。

    1.搭建Zerotier根服务器

    依然使用我们的老伙计docker来实现,创建很简单,一条命令创建即可。

    docker run --restart=on-failure:3 -d --name ztncui -e HTTP_PORT=4000 -e HTTP_ALL_INTERFACES=yes -e ZTNCUI_PASSWD=admin@123 -p 4000:4000 keynetworks/ztncui
    
    v2-50aeecc54c9895c8574b0a4165221526_1440w

    2.搭建Moon服务器

    前面也介绍过了,使用Zerotier在一定程度上是可以P2P打洞成功的,不成功的时候就可以使用我们的Moon服务器来进行中转,保证完成组网。此服务需要占用tcp及udp的9993端口

    # 创建一个持久化存放文件的目录
    mkdir -p /opt/docker/moon
    # 获得云服务器的公网ip
    public_ip=`curl ip.sb`
    # 建立moon服务器
    docker run --name zerotier-moon -d -p 9993:9993 -p 9993:9993/udp -v /opt/docker/moon:/var/lib/zerotier-one jonnyan404/zerotier-moon -4 $public_ip
    
    v2-377be9d8bf36de4ac5160a44f9a8d913_1440w

    到此我们的服务端就搭建好了。查看一下日志,记录一下moon id,后面加入会用到。

    docker logs -f zerotier-moon
    
    v2-248e447426ba45b47f8e359bd955bb98_1440w

    3.创建网络

    使用我们云服务器 ip:4000访问,ip为云服务器的公网ip,打开配置页。

    v2-9bfa097eeda8bb540a7ddc22ce94381d_1440w

    点击右上角的login登录。

    v2-ab0dbc5c15a5416a8067f147e609fdfc_1440w

    使用默认用户名和密码登录: admin/admin@123,登录完成后根据提示修改密码。

    v2-ee9ba5ccd5a0ca521cefe77d2b87540a_1440w

    设置完成后,切换到Add network选项卡,任意为网络起一个名字。

    v2-197807d2b2360b9f5e8307fac2b18f49_1440w

    点击Create Network

    v2-90b862a8d1c0e22baaabf43fb19fe321_1440w

    这样我们的网络就设置好了,请记录创建好的网络id。

    v2-a999e77c5536b34cc3e067f1bcad6d9e_1440w

    回到上一级页面,最后在network上,设置网段,可以点击自动生成,然后提交。

    v2-be17385a59254559fa9e2c998834484c_1440w
    v2-6914898a38247435e41e136fb1b15019_1440w

    4.搭建客户端

    为了方便演示不同平台,我这里以一台Linux和一台Windows为例子演示组网过程。

    • Windows:

    首先到官方网站上下载Windows客户端:

    https://www.zerotier.com/download/
    

    安装很简单,下一步即可。完成后,在开始菜单中可以找到安装的ZeroTier软件,右下角会多出图标,打开面板。把之前记下的网络填入下方,点击Join Network。

    v2-90b6b0635b64ad049b3f0059efb7f38a_1440w

    回到网页上授权,并定义一个友好的名字,方便辨认。

    v2-9f1bd0316bb04179d7f23a607f4513b2_1440w

    客户端上,状态显示成功时,表示搭建成功。

    v2-b27cba8357f35f29e3ab031350ce8648_1440w

    最后在配置一下加入moon服务器,打开cmd。

    cd C:\ProgramData\ZeroTier\One
    zerotier-cli orbit [moon_id] [moon_id]
    

    将之前记录的moon id填进去后执行。

    v2-383e302d78e5e2ec40d3684af61da546_1440w

    查看是否加入monn节点:

    zerotier-cli listpeers
    

    可以看到其中包含我们自建moon服务器的公网ip地址。

    v2-025e0f9ee4bb76ec529a9b5e82cdab30_1440w
    • Linux:

    拉取镜像:

    docker pull bltavares/zerotier
    

    配置镜像:

    docker run -d --device=/dev/net/tun \
    --name zerotier-one \
    --net=host \
    --restart=always \
    --cap-add=NET_ADMIN \
    --cap-add=SYS_ADMIN \
    -v /var/lib/zerotier-one:/var/lib/zerotier-one \
    bltavares/zerotier:latest
    
    v2-648882187c5913ad9777c114626082d2_1440w

    加入zerotier网络

    docker exec zerotier-one zerotier-cli join [网络ID]
    
    v2-5142e213bdf1362dca2a78aee6b9b3e1_1440w

    显示 200 join ok 即添加成功。同样的需要在网页上去授权此节点。可以看到已经有虚拟ip生成,可以测试下两台主机之间的联通性。

    v2-e98306bed8240d3ca8f6ab351e8d4286_1440w

    发现已经可以使用p2p建立虚拟网络了,一台四川的服务器和一台北京的阿里云服务器,延迟大概40ms左右,效果还是很不错的。

    v2-16b12d71bb25015344ab47c125ad11f3_1440w

    最后再加入moon服务器,同样的需要把moon_ID的值修改为自建moon服务器的id。

    #加入moon服务器
    docker exec zerotier-one zerotier-cli orbit [moon_ID] [moon_ID]
    #确认是否加入
    docker exec zerotier-one zerotier-cli listpeers 
    
    v2-20043a27bed063d5f09ecb53d7728d62_1440w

    至此~

  • 删除linux网卡命令

    在Linux操作系统中删除网络接口的命令是ifconfigip命令。下面将详细说明如何使用这两个命令来删除Linux网卡。

    使用ifconfig命令删除网卡:

    1. 打开终端或控制台窗口。
    2. 输入ifconfig命令,查看当前系统中的网卡接口列表,确认要删除的网卡接口的名称,一般以ethenp开头。
    3. 输入以下命令以删除网卡接口: “ sudo ifconfig down # 关闭网卡接口 sudo ifconfig del # 删除网卡接口 “ 请将“替换为要删除的网卡接口的名称。
    4. 输入密码(如果有)以确认操作。

    使用ip命令删除网卡:

    1. 打开终端或控制台窗口。
    2. 输入ip link show命令,查看当前系统中的网卡接口列表,确认要删除的网卡接口的名称,一般以ethenp开头。
    3. 输入以下命令以删除网卡接口: “ sudo ip link set down # 关闭网卡接口 sudo ip link delete # 删除网卡接口 “ 请将“替换为要删除的网卡接口的名称。
    4. 输入密码(如果有)以确认操作。

    需要注意的是,删除网卡接口后将无法使用该接口进行网络连接。请确保在执行删除操作之前备份重要数据,并确保不会影响系统的正常运行。

    此外,还可以通过编辑/etc/network/interfaces文件或/etc/sysconfig/network-scripts/ifcfg-文件来删除网卡接口的配置信息,但这种操作比较复杂,需要对网络配置文件有一定的了解。强烈建议在进行此类操作之前备份相关配置文件,以防止意外数据丢失。

  • rpm 安装教程

    下面讲解一下,如何使用 rpm 命令对 RPM 二进制包进行安装、卸载和升级操作。我们以安装 apache 程序为例。

    RPM包默认安装路径

    通常情况下,RPM 包采用系统默认的安装路径,所有安装文件会按照类别分散安装到下表所示的目录中。

    RPM 包默认安装路径
    安装路径 含 义
    /etc/ 配置文件安装目录
    /usr/bin/ 可执行的命令安装目录
    /usr/lib/ 程序所使用的函数库保存位置
    /usr/share/doc/ 基本的软件使用手册保存位置
    /usr/share/man/ 帮助文件保存位置

    RPM 包的默认安装路径是可以通过命令查询的。

    除此之外,RPM 包也支持手动指定安装路径,但此方式并不推荐。因为一旦手动指定安装路径,所有的安装文件会集中安装到指定位置,且系统中用来查询安装路径的命令也无法使用(需要进行手工配置才能被系统识别),得不偿失。

    与 RPM 包不同,源码包的安装通常采用手动指定安装路径(习惯安装到 /usr/local/ 中)的方式。既然安装路径不同,同一 apache 程序的源码包和 RPM 包就可以安装到一台 Linux 服务器上(但同一时间只能开启一个,因为它们需要占用同一个 80 端口)。

    实际情况中,一台服务器几乎不会同时包含两个 apache 程序,管理员不好管理,还会占用过多的服务器磁盘空间。

    RPM 包的安装

    安装 RPM 的命令格式为:

    [root@localhost ~]# rpm -ivh 包全名

    注意一定是包全名。涉及到包全名的命令,一定要注意路径,可能软件包在光盘中,因此需提前做好设备的挂载工作。

    此命令中各选项参数的含义为:

    • -i:安装(install);
    • -v:显示更详细的信息(verbose);
    • -h:打印 #,显示安装进度(hash);

    例如,使用此命令安装 apache 软件包,如下所示:

    1. [root@localhost ~]# rpm -ivh \
    2. /mnt/cdrom/Packages/httpd-2.2.1515.el6.centos.1.i686.rpm
    3. Preparing…
    4. ####################
    5. [100%]
    6. 1:httpd
    7. ####################
    8. [100%]

    注意,直到出现两个 100% 才是真正的安装成功,第一个 100% 仅表示完成了安装准备工作。

    此命令还可以一次性安装多个软件包,仅需将包全名用空格分开即可,如下所示:

    [root@localhost ~]# rpm -ivh a
    .rpm b
    .rpm c
    .rpm

    如果还有其他安装要求(比如强制安装某软件而不管它是否有依赖性),可以通过以下选项进行调整:

    • -nodeps:不检测依赖性安装。软件安装时会检测依赖性,确定所需的底层软件是否安装,如果没有安装则会报错。如果不管依赖性,想强制安装,则可以使用这个选项。注意,这样不检测依赖性安装的软件基本上是不能使用的,所以不建议这样做。
    • -replacefiles:替换文件安装。如果要安装软件包,但是包中的部分文件已经存在,那么在正常安装时会报”某个文件已经存在”的错误,从而导致软件无法安装。使用这个选项可以忽略这个报错而覆盖安装。
    • -replacepkgs:替换软件包安装。如果软件包已经安装,那么此选项可以把软件包重复安装一遍。
    • -force:强制安装。不管是否已经安装,都重新安装。也就是 -replacefiles 和 -replacepkgs 的综合。
    • -test:测试安装。不会实际安装,只是检测一下依赖性。
    • -prefix:指定安装路径。为安装软件指定安装路径,而不使用默认安装路径。

    apache 服务安装完成后,可以尝试启动:

    [root@localhost ~]# service 服务名 start|stop|restart|status

    各参数含义:

    • start:启动服务;
    • stop:停止服务;
    • restart:重启服务;
    • status: 查看服务状态;

    例如:

    [root@localhost ~]# service httpd start #启动apache服务

    服务启动后,可以查看端口号 80 是否出现。命令如下:

    1. [root@localhost ~]# netstat -tlun | grep 80
    2. tcp 0 0 :::80 :::* LISTEN

    RPM包的升级

    使用如下命令即可实现 RPM 包的升级:

    [root@localhost ~]# rpm -Uvh 包全名

    -U(大写)选项的含义是:如果该软件没安装过则直接安装;若已经安装则升级至最新版本。

    [root@localhost ~]# rpm -Fvh 包全名

    -F(大写)选项的含义是:如果该软件没有安装,则不会安装,必须安装有较低版本才能升级。

    RPM包的卸载

    RPM 软件包的卸载要考虑包之间的依赖性。例如,我们先安装的 httpd 软件包,后安装 httpd 的功能模块 mod_ssl 包,那么在卸载时,就必须先卸载 mod_ssl,然后卸载 httpd,否则会报错。

    软件包卸载和拆除大楼是一样的,本来先盖的 2 楼,后盖的 3 楼,那么拆楼时一定要先拆除 3 楼。

    如果卸载 RPM 软件不考虑依赖性,执行卸载命令会包依赖性错误,例如:

    1. [root@localhost ~]# rpm -e httpd
    2. error: Failed dependencies:
    3. httpd-mmn = 20051115 is needed by (installed) mod_wsgi-3.21.el6.i686
    4. httpd-mmn = 20051115 is needed by (installed) php-5.3.33.el6_2.8.i686
    5. httpd-mmn = 20051115 is needed by (installed) mod_ssl-1:2.2.1515.el6.
    6. centos.1.i686
    7. httpd-mmn = 20051115 is needed by (installed) mod_perl-2.0.410.el6.i686
    8. httpd = 2.2.1515.el6.centos.1 is needed by (installed) httpd-manual-2.2.
    9. 1515.el6.centos.1 .noarch
    10. httpd is needed by (installed) webalizer-2.21_023.3.el6.i686
    11. httpd is needed by (installed) mod_ssl-1:2.2.1515.el6.centos.1.i686
    12. httpd= 0:2.2.1515.el6.centos.1 is needed by(installed)mod_ssl-1:2.2.1515.el6.centos.1.i686

    RPM 软件包的卸载很简单,使用如下命令即可:

    [root@localhost ~]# rpm -e 包名

    -e 选项表示卸载,也就是 erase 的首字母。

    RPM 软件包的卸载命令支持使用“-nocteps”选项,即可以不检测依赖性直接卸载,但此方式不推荐大家使用,因为此操作很可能导致其他软件也无法征程使用。

  • 正则表达式 – 修饰符

    正则表达式中常用的模式修正符有i、g、m、s、U、x、a、D、e 等。它们之间可以组合搭配使用。

    修饰符 含义 描述
    i ignore – 不区分大小写 将匹配设置为不区分大小写,搜索时不区分大小写: A 和 a 没有区别。
    g global – 全局匹配 查找所有的匹配项。
    m more – 多行匹配 使边界字符 ^ 和 $ 匹配每一行的开头和结尾,记住是多行,而不是整个字符串的开头和结尾。
    s 特殊字符圆点 . 中包含换行符 \n 默认情况下的圆点 . 是 匹配除换行符 \n 之外的任何字符,加上 s 修饰符之后, . 中包含换行符 \n。

    i 不区分(ignore)大小写

    例如: /abc/i 可以匹配 abc、aBC、Abc

    g 全局(global)匹配

    如果不带g,正则过程中字符串从左到右匹配,找到第一个符合条件的即匹配成功,返回

    如果带g,则字符串从左到右,找到每个符合条件的都记录下来,知道字符串结尾位置

    例如:

    var str = ‘aaaaaaaa’

    var reg1 = /a/; str.match(reg1) // 结果为:[“a”, index: 0, input: “aaaaaaaa”]

    var reg2 = /a/g; str.match(reg2) // 结果为:[“a”, “a”, “a”, “a”, “a”, “a”, “a”, “a”]

    m 多(more)行匹配

    若存在换行\n并且有开始^或结束$符的情况下,和g一起使用实现全局匹配,

    因为存在换行时默认会把换行符作为一个字符任务匹配字符串是个单行,

    g只匹配第一行,添加m之后实现多行,每个换行符之后就是开始

    var str = “abcggab\nabcoab”;

    var preg1 = /^abc/gm; str.match(preg1) // 结果为:[“abc”, “abc”]

    var preg2 = /ab$/gm; str.match(preg2) // 结果为:[“ab”, “ab”]

    s 特殊字符圆点 . 中包含换行符

    默认的圆点 . 是 匹配除换行符 \n 之外的任何单字符,加上s之后, . 中包含换行符

    $str = “abggab\nacbs”;

    $preg = “/b./s”;

    preg_match_all($preg, $str,$matchs);

    print_r($matchs);//Array ( [0] => Array ( [0] => bg [1] => b [2] => bs ) )

    U 只匹配最近的一个字符串;不重复匹配;

    $mode=”/a(.*?)c/”;

    $preg=”/a.*c/U”;//这两个正则返回相同的值

    $str=”abcabbbcabbbbbc” ;

    preg_match($mode,$str,$content); echo $content[0];//abc

    preg_match($preg,$str,$content); echo $content[0];//abc

    修正符:x 将模式中的空白忽略; 修正符:A 强制从目标字符串开头匹配; 修正符:D 如果使用$限制结尾字符,则不允许结尾有换行; 修正符:e 配合函数preg_replace()使用, 可以把匹配来的字符串当作正则表达式执行;

  • 正则表达式-元字符

    正则表达式-元字符

    字符 描述
    \ 将下一个字符标记为一个特殊字符、或一个原义字符、或一个向后引用、或一个八进制转义符。例如,“n”匹配字符“n”。“\n”匹配一个换行符。串行“\\”匹配“\”而“\(”则匹配“(”。
    ^ 匹配输入字符串的开始位置。如果设置了RegExp对象的Multiline属性,^也匹配“\n”或“\r”之后的位置。
    $ 匹配输入字符串的结束位置。如果设置了RegExp对象的Multiline属性,$也匹配“\n”或“\r”之前的位置。
    * 匹配前面的子表达式零次或多次。例如,zo*能匹配“z”以及“zoo”。*等价于{0,}。
    + 匹配前面的子表达式一次或多次。例如,“zo+”能匹配“zo”以及“zoo”,但不能匹配“z”。+等价于{1,}。
    ? 匹配前面的子表达式零次或一次。例如,“do(es)?”可以匹配“does”或“does”中的“do”。?等价于{0,1}。
    {n} n是一个非负整数。匹配确定的n次。例如,“o{2}”不能匹配“Bob”中的“o”,但是能匹配“food”中的两个o。
    {n,} n是一个非负整数。至少匹配n次。例如,“o{2,}”不能匹配“Bob”中的“o”,但能匹配“foooood”中的所有o。“o{1,}”等价于“o+”。“o{0,}”则等价于“o*”。
    {n,m} m和n均为非负整数,其中n<=m。最少匹配n次且最多匹配m次。例如,“o{1,3}”将匹配“fooooood”中的前三个o。“o{0,1}”等价于“o?”。请注意在逗号和两个数之间不能有空格。
    ? 当该字符紧跟在任何一个其他限制符(*,+,?,{n},{n,},{n,m})后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串“oooo”,“o+?”将匹配单个“o”,而“o+”将匹配所有“o”。
    . 匹配除“\ n”之外的任何单个字符。要匹配包括“\ n”在内的任何字符,请使用像“(.|\n)”的模式。
    (pattern) 匹配pattern并获取这一匹配。所获取的匹配可以从产生的Matches集合得到,在VBScript中使用SubMatches集合,在JScript中则使用$0…$9属性。要匹配圆括号字符,请使用“\(”或“\)”。
    (?:pattern) 匹配pattern但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。这在使用或字符“(|)”来组合一个模式的各个部分是很有用。例如“industr(?:y|ies)”就是一个比“industry|industries”更简略的表达式。
    (?=pattern) 正向肯定预查,在任何匹配pattern的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如,“Windows(?=95|98|NT|2000)”能匹配“Windows2000”中的“Windows”,但不能匹配“Windows3.1”中的“Windows”。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。
    (?!pattern) 正向否定预查,在任何不匹配pattern的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如“Windows(?!95|98|NT|2000)”能匹配“Windows3.1”中的“Windows”,但不能匹配“Windows2000”中的“Windows”。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始
    (?<=pattern) 反向肯定预查,与正向肯定预查类拟,只是方向相反。例如,“(?<=95|98|NT|2000)Windows”能匹配“2000Windows”中的“Windows”,但不能匹配“3.1Windows”中的“Windows”。
    (?<!pattern) 反向否定预查,与正向否定预查类拟,只是方向相反。例如“(?<!95|98|NT|2000)Windows”能匹配“3.1Windows”中的“Windows”,但不能匹配“2000Windows”中的“Windows”。
    x|y 匹配x或y。例如,“z|food”能匹配“z”或“food”。“(z|f)ood”则匹配“zood”或“food”。
    [xyz] 字符集合。匹配所包含的任意一个字符。例如,“[abc]”可以匹配“plain”中的“a”。
    [^xyz] 负值字符集合。匹配未包含的任意字符。例如,“[^abc]”可以匹配“plain”中的“p”。
    [a-z] 字符范围。匹配指定范围内的任意字符。例如,“[a-z]”可以匹配“a”到“z”范围内的任意小写字母字符。
    [^a-z] 负值字符范围。匹配任何不在指定范围内的任意字符。例如,“[^a-z]”可以匹配任何不在“a”到“z”范围内的任意字符。
    \b 匹配一个单词边界,也就是指单词和空格间的位置。例如,“er\b”可以匹配“never”中的“er”,但不能匹配“verb”中的“er”。
    \B 匹配非单词边界。“er\B”能匹配“verb”中的“er”,但不能匹配“never”中的“er”。
    \cx 匹配由x指明的控制字符。例如,\cM匹配一个Control-M或回车符。x的值必须为A-Z或a-z之一。否则,将c视为一个原义的“c”字符。
    \d 匹配一个数字字符。等价于[0-9]。
    \D 匹配一个非数字字符。等价于[^0-9]。
    \f 匹配一个换页符。等价于\x0c和\cL。
    \n 匹配一个换行符。等价于\x0a和\cJ。
    \r 匹配一个回车符。等价于\x0d和\cM。
    \s 匹配任何空白字符,包括空格、制表符、换页符等等。等价于[ \f\n\r\t\v]。
    \S 匹配任何非空白字符。等价于[^ \f\n\r\t\v]。
    \t 匹配一个制表符。等价于\x09和\cI。
    \v 匹配一个垂直制表符。等价于\x0b和\cK。
    \w 匹配包括下划线的任何单词字符。等价于“[A-Za-z0-9_]”。
    \W 匹配任何非单词字符。等价于“[^A-Za-z0-9_]”。
    \xn 匹配n,其中n为十六进制转义值。十六进制转义值必须为确定的两个数字长。例如,“\x41”匹配“A”。“\x041”则等价于“\x04&1”。正则表达式中可以使用ASCII编码。.
    \num 匹配num,其中num是一个正整数。对所获取的匹配的引用。例如,“(.)\1”匹配两个连续的相同字符。
    \n 标识一个八进制转义值或一个向后引用。如果\n之前至少n个获取的子表达式,则n为向后引用。否则,如果n为八进制数字(0-7),则n为一个八进制转义值。
    \nm 标识一个八进制转义值或一个向后引用。如果\nm之前至少有nm个获得子表达式,则nm为向后引用。如果\nm之前至少有n个获取,则n为一个后跟文字m的向后引用。如果前面的条件都不满足,若n和m均为八进制数字(0-7),则\nm将匹配八进制转义值nm。
    \nml 如果n为八进制数字(0-3),且m和l均为八进制数字(0-7),则匹配八进制转义值nml。
    \un 匹配n,其中n是一个用四个十六进制数字表示的Unicode字符。例如,\u00A9匹配版权符号(©)。
  • 正则表达式 – 语法

    正则表达式是一种文本模式,包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为“元字符”)。模式描述在搜索文本时要匹配的一个或多个字符串。

    1.正则表达式基本语法

    两个特殊的符号’^’和’$’。他们的作用是分别指出一个字符串的开始和结束。例子如下:

    "^The":表示所有以"The"开始的字符串("There","The cat"等); "of despair$":表示所以以"of despair"结尾的字符串; "^abc$":表示开始和结尾都是"abc"的字符串——呵呵,只有"abc"自己了; "notice":表示任何包含"notice"的字符串。

    象最后那个例子,如果你不使用两个特殊字符,你就在表示要查找的串在被查找串的任意部分——你并 不把它定位在某一个顶端。

    其它还有’*’,’+’和’?’这三个符号,表示一个或一序列字符重复出现的次数。它们分别表示“没有或 更多”,“一次或更多”还有“没有或一次”。下面是几个例子:

    "ab*":表示一个字符串有一个a后面跟着零个或若干个b。("a", "ab", "abbb",……); "ab+":表示一个字符串有一个a后面跟着至少一个b或者更多; "ab?":表示一个字符串有一个a后面跟着零个或者一个b; "a?b+$":表示在字符串的末尾有零个或一个a跟着一个或几个b。

    你也可以使用范围,用大括号括起,用以表示重复次数的范围。

    "ab{2}":表示一个字符串有一个a跟着2个b("abb"); "ab{2,}":表示一个字符串有一个a跟着至少2个b; "ab{3,5}":表示一个字符串有一个a跟着3到5个b。

    请注意,你必须指定范围的下限(如:"{0,2}"而不是"{,2}")。还有,你可能注意到了,’*’,’+’和 ‘?’相当于"{0,}","{1,}"和"{0,1}"。 还有一个’¦’,表示“或”操作:

    "hi¦hello":表示一个字符串里有"hi"或者"hello"; "(b¦cd)ef":表示"bef"或"cdef"; "(a¦b)*c":表示一串"a""b"混合的字符串后面跟一个"c";

    ‘.’可以替代任何字符:

    "a.[0-9]":表示一个字符串有一个"a"后面跟着一个任意字符和一个数字; "^.{3}$":表示有任意三个字符的字符串(长度为3个字符);

    方括号表示某些字符允许在一个字符串中的某一特定位置出现:

    "[ab]":表示一个字符串有一个"a"或"b"(相当于"a¦b"); "[a-d]":表示一个字符串包含小写的’a’到’d’中的一个(相当于"a¦b¦c¦d"或者"[abcd]"); "^[a-zA-Z]":表示一个以字母开头的字符串; "[0-9]%":表示一个百分号前有一位的数字; ",[a-zA-Z0-9]$":表示一个字符串以一个逗号后面跟着一个字母或数字结束。

    你也可以在方括号里用’^’表示不希望出现的字符,’^’应在方括号里的第一位。(如:"%[^a-zA-Z]%"表 示两个百分号中不应该出现字母)。

    为了逐字表达,你必须在"^.$()¦*+?{\"这些字符前加上转移字符’\’。

    请注意在方括号中,不需要转义字符。

    2.正则表达式验证控制文本框的输入字符类型

    1.只能输入数字和英文的:

    <input onkeyup="value=value.replace(/[\W]/g,”) " onbeforepaste="clipboardData.setData(‘text’,clipboardData.getData(‘text’).replace(/[^\d]/g,”))" ID="Text1" NAME="Text1">

    2.只能输入数字的:

    <input onkeyup="value=value.replace(/[^\d]/g,”) " onbeforepaste="clipboardData.setData(‘text’,clipboardData.getData(‘text’).replace(/[^\d]/g,”))" ID="Text2" NAME="Text2">

    3.只能输入全角的:

    <input onkeyup="value=value.replace(/[^\uFF00-\uFFFF]/g,”)" onbeforepaste="clipboardData.setData(‘text’,clipboardData.getData(‘text’).replace(/[^\uFF00-\uFFFF]/g,”))" ID="Text3" NAME="Text3">

    4.只能输入汉字的:

    <input onkeyup="value=value.replace(/[^\u4E00-\u9FA5]/g,”)" onbeforepaste="clipboardData.setData(‘text’,clipboardData.getData(‘text’).replace(/[^\u4E00-\u9FA5]/g,”))" ID="Text4" NAME="Text4">

    3.正则表达式的应用实例通俗说明


    //校验是否全由数字组成

    /^[0-9]{1,20}$/

    ^ 表示打头的字符要匹配紧跟^后面的规则

    $ 表示打头的字符要匹配紧靠$前面的规则

    [ ] 中的内容是可选字符集

    [0-9] 表示要求字符范围在0-9之间

    {1,20}表示数字字符串长度合法为1到20,即为[0-9]中的字符出现次数的范围是1到20次。 /^ 和 $/成对使用应该是表示要求整个字符串完全匹配定义的规则,而不是只匹配字符串中的一个子串。


    //校验登录名:只能输入5-20个以字母开头、可带数字、“_”、“.”的字串

    /^[a-zA-Z]{1}([a-zA-Z0-9]|[._]){4,19}$/

    ^[a-zA-Z]{1} 表示第一个字符要求是字母。

    ([a-zA-Z0-9]|[.]){4,19} 表示从第二位开始(因为它紧跟在上个表达式后面)的一个长度为4到9位的字符串,它要求是由大小写字母、数字或者特殊字符集[.]组成。


    //校验用户姓名:只能输入1-30个以字母开头的字串

    /^[a-zA-Z]{1,30}$/


    //校验密码:只能输入6-20个字母、数字、下划线

    /^(\w){6,20}$/

    \w:用于匹配字母,数字或下划线字符


    //校验普通电话、传真号码:可以“+”或数字开头,可含有“-” 和 “ ”

    /^[+]{0,1}(\d){1,3}[ ]?([-]?((\d)|[ ]){1,12})+$/

    \d:用于匹配从0到9的数字;

    “?”元字符规定其前导对象必须在目标对象中连续出现零次或一次

    可以匹配的字符串如:+123 -999 999 ; +123-999 999 ;123 999 999 ;+123 999999等


    //校验URL

    /^http[s]{0,1}:\/\/.+$/ 或 /^http[s]{0,1}:\/\/.{1,n}$/ (表示url串的长度为length(“https://”) + n )

    \ / :表示字符“/”。

    . 表示所有字符的集

    • 等同于{1,},就是1到正无穷吧。