精华内容
下载资源
问答
  • php正则表达式中的非贪婪模式匹配一般情况下,正则表达式的匹配是贪婪模式的,比如下面这个例子:字符串:....src="http://www.bloghome.cn/1.mp3"type="application/x-mplayer2"....要求的结果:...

    php正则表达式中的非贪婪模式匹配

    一般情况下,正则表达式的匹配是贪婪模式的,比如下面这个例子:

    字符串:....src="http://www.bloghome.cn/1.mp3" type="application/x-mplayer2" ....

    要求的结果:http://www.bloghome.cn/1.mp3

    如果匹配表达式写为:/src="(.*)"/,则得不到正确的结果,因为最后一个双引号的匹配是贪婪模式的。

    解决办法:匹配表达式写为:

    /src="(.*)".?/

    上面表达式中,".?是非贪婪模式匹配。也就是说,只要在一个字符后面跟上限定个数的特殊字符,匹配就是非贪婪模式了。

    时间: 2007-02-12

    本文实例讲述了PHP正则匹配中英文.数字及下划线的方法.分享给大家供大家参考,具体如下: 一.问题: 对于用户注册时的用户名要求由中英文.数字或下划线组成,不得含有其他字符. 二.解决方法: 针对输入字符进行中英文.数字及下划线的正则验证即可. 代码如下: $username='我们jb51.net@#--^&*'; $preg='/[\w\x{4e00}-\x{9fa5}]+/u'; //$preg='/[\x80-\xff_\w]+/u'; preg_match($preg,$usernam

    使用php的正则表达式来实现: $content = '这里是文章内容,这里插入一张图片测试 XXXXXXXXXXXXXXXXXXXX'; $content = stripslashes ( $content ); $img_array = array (); // 匹配所有远程图片 preg_match_all ( "/(src|SRC)=["|'| ]{0,}(http://(.*).(gif|jpg|jpeg|bmp|png

    比较简单的 $str = ''; $isMatched = preg_match('/^^((https|http|ftp|rtsp|mms)?:\/\/)[^\s]+$/', $str, $matches); var_dump($isMatched, $matches); 几乎可以匹配任何网址: ^((https?|ftp|news):\/\/)?([a-z]([a-z0-9\-]*[\..])+([a-z]{2}|aero|arpa|biz|com|coop|edu|gov|info|int

    我以前一直用这个 复制代码 代码如下: preg_match('~[\x7f-\xff]+~is', $string, $tmp); 今天才发现,上面这个也会匹配到一些欧洲国家的字符 应该用下面这个,注意修正符 u 复制代码 代码如下: preg_match('~[\x{4e00}-\x{9fa5}]+~u', $string, $tmp);

    在php中汉字正则可能有些朋友觉得很简单,但是在使用时会发现在gbk编码与uft8编码可能会有点区别哦,下面小编来介绍一下.gbk编码下汉字正则 1.判断字符串是否全是汉字 复制代码 代码如下: <?php     $str = '全部是汉字测试';    if (preg_match_all("/^([x81-xfe][x40-xfe])+$/", $str, $match)) {        echo '全部是汉字';      } else {        echo '不

    复制代码 代码如下: $str = '中华人民共和国123456789abcdefg'; echo preg_match("/^[u4e00-u9fa5_a-zA-Z0-9]{3,15}$",$strName); 运行一下上面这段代码,看会有什么提示信息? Warning: preg_match(): Compilation failed: PCRE does not support L, l, N, P, p, U, u, or X at offset 3 in F:wwwrootp

    php正则匹配汉字! /^[\x{4e00}-\x{9fa5}]+$/u 以上这个正则表达式就是困扰了很多php程序员的匹配汉字的正则表达式 大家可能会觉得很简单,实际上不同编码,不同程序语言,都有些细微的出入,稍不注意就得不到正确的结果. 下面是utf-8编码的例子:$str = "汉字";if (preg_match("/^[\x{4e00}-\x{9fa5}]+$/u",$str)) {print("该字符串全部是中文");} else {

    本文实例讲述了正则匹配密码只能是数字和字母组合字符串功能.分享给大家供大家参考,具体如下: 密码要求: 1. 不能全部是数字 2. 不能全部是字母 3. 必须是数字和字母组合 4. 不包含特殊字符 5. 密码长度6-30位的字符串 /** * @desc get_pwd_strength()im:根据密码字符串判断密码结构 * @param (string)$mobile * return 返回:$msg */ function get_pwd_strength($pwd){ if (strle

    正则: 复制代码 代码如下: $newstext=preg_replace(preg_replace('/(]+src\s*=\s*"?([^>"\s]+)"?[^>]*>)/im', '6b5aa0751a6f1e6a9d0b665a02cc1f46.gif

    正则表达式的写法规则:"/规则需要写在2个斜杠中间/". (. :小数点)用于匹配除换行符之外的所有字符. (\s:反斜杠小写s)用于匹配单个空格符,包括tab键和换行符: (\S:反斜杠大写S)用于匹配除单个空格符之外的所有字符: (\d:反斜杠d)用于匹配从0到9的数字:也可以这样写:[0-9] (\w:反斜杠小写w)用于匹配字母,数字或下划线字符: (\W:反斜杠大写W)用于匹配所有与\w不匹配的字符: 元字符包括: +, *,? 元字符理解起来容易混淆,所以我在后面做了代码结果

    本文实例讲述了php与javascript正则匹配中文的方法.分享给大家供大家参考,具体如下: php中正则匹配utf-8中文: (重点是:[\x{4e00}-\x{9fa5}]+) $str = "我们"; if (preg_match("/^[\x{4e00}-\x{9fa5}]+$/u",$str,$arr)) { print("该字符串全部是中文"); echo '

    '; print_r($arr); } else {

    在PHP的官网上看到的parse_url()函数的替代方案.结果和parse_url()函数差不多,是使用正则实现的.URI 是 Web上可用的每种资源 - HTML文档.图像.视频片段.程序等 - 由一个通用资源标志符(Uniform Resource Identifier, 简称"URI")进行定位. 对象分组: 复制代码 代码如下: ^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?12            3

    本文实例讲述了JS正则匹配URL网址的方法.分享给大家供大家参考,具体如下: 最强的匹配网址-url的正则表达式:匹配www,http开头的一切网址 直接插入正则表达式: [a-zA-Z0-9][-a-zA-Z0-9]{0,62}(\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+\.? 完整的js方法: function isURL(domain) { var name = /[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(\.[a-zA-Z0-9][-a-zA-Z

    首先来个简单的例子,利用Python实现匹配163邮箱的代码: #-*- coding:utf-8 -*- __author__ = '杨鑫' import re text = input("Please input your Email address:\n"): if re.match(r'[0-9a-zA-Z_]{0,19}@163.com',text): print('Email address is Right!') else: print('Please reset you

    正则表达式,又称规则表达式.(英语:Regular Expression,在代码中常简写为regex.regexp或RE),计算机科学的一个概念.正则表通常被用来检索.替换那些符合某个模式(规则)的文本.下面通过实例代码给大家介绍正则表达式匹配(URL.电话.手机.邮箱)的实例代码,一起看看吧! 废话不多说了,直接给大家贴代码了,具体代码如下所示:

    具体代码如下所示: /* 定义替换对象键值 */ var setReferArgs = function(){ var referArgs = new Object(); referArgs['#userID\#'] = userId; referArgs['\#userName\#'] = userName; return referArgs; } /* 替换URL的参数 */ var replaceUrlParams = function(url){ var actualUrl = "&qu

    Django框架中的URL分发采用正则表达式匹配来进行,以下是正则表达式的基本规则: 官方演示代码: from django.conf.urls import url from . import views urlpatterns = [ url(r'^articles/2003/$', views.special_case_2003), url(r'^articles/([0-9]{4})/$', views.year_archive), url(r'^articles/([0-9]{4})/

    本文实例讲述了Java使用正则表达式匹配获取链接地址的方法.分享给大家供大家参考,具体如下: 获取页面中字符串的url地址我们都会使用正则表达式来匹配获取了,下面我来给大家总结几个匹配获取链接地址示例. 1.正则表达式中Matcher中find()方法的应用. 2.String对象中的 replaceAll(String regex,String replacement) 方法的使用.通过这个方法去除了不必要的字符串,从而得到了需要的网址和链接文字 例1.超简单的 String content

    badde5937d2d7e9a0406325d0bb4110f.png

    本文实例讲述了Python使用中文正则表达式匹配指定中文字符串的方法.分享给大家供大家参考,具体如下: 业务场景: 从中文字句中匹配出指定的中文子字符串 .这样的情况我在工作中遇到非常多, 特梳理总结如下. 难点: 处理GBK和utf8之类的字符编码, 同时正则匹配Pattern中包含汉字,要汉字正常发挥作用,必须非常谨慎.推荐最好统一为utf8编码,如果不是这种最优情况,也有酌情处理. 往往一个具有普适性的正则表达式会简化程序和代码的处理,使过程简洁和事半功倍,这往往是高手和菜鸟最显著的差别.

    %% 首先,正则表达式: String check = @"((http|ftp|https)://)(([a-zA-Z0-9\._-]+\.[a-zA-Z]{2,6})|([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}))(:[0-9]{1,4})*(/[a-zA-Z0-9\&%_\./-~-]*)?"; 关于该正则表达式的说明: ①:该正则表达式匹

    正则表达式:符合一定规则的表达式 作用:用于专门操作字符串 特点:用于一些特定的符号来表示一些代码操作,这样就简化书写,主要是学习一些特殊符号的使用 好处:可以简化对字符串的复杂操作. 弊端:符号定义越多,正则越长,阅读性越差 具体操作: 1.匹配:String matches方法 用规则匹配所有的字符串,只要有一个不符合,则匹配结束. 2.切割:String sqlit(); 3.替换:replaceAll(); 4.获取:将字符串中的符合规则的子串取出. 操作步骤: 首先,将正则表大式封装成

    展开全文
  • 正则表达式的贪婪和非贪婪匹配

    千次阅读 2019-06-14 13:03:40
    非贪婪匹配:匹配到结果就好。 默认是贪婪模式。在量词后面直接加一个问号?就是非贪婪模式。 量词:{m.n}:m到n个 *:任意多个(表示匹配0-无穷) +:一个到多个(表示匹配1-无穷) ?:0或一个 .表示除\n...

    贪婪匹配:正则表达式一般趋向于最大长度匹配。

    非贪婪匹配:匹配到结果就好。

    默认是贪婪模式。在量词后面直接加一个问号?就是非贪婪模式。

    量词:{m.n}:m到n个    

    *:任意多个(表示匹配0-无穷)

    +:一个到多个(表示匹配1-无穷)        

    ?:0或一个

    .表示除\n之外的任意字符

    (?=Expression)顺序环视,(?=\\()就是匹配正括号

     

    eg:

    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    public class regular_expression {
    public static void main(String[] args) {
    String str = "北京市(重庆市)(武汉市)(广州市)";
    String patStr = ".*?(?=\\()";
    Pattern pattern = Pattern.compile(patStr);//创建Pattern对象,它是正则表达式的编译表示
    Matcher matcher = pattern.matcher(str);//创建Matcher对象,它是对输入的字符串进行解释和匹配操作的引擎
    if(matcher.find()) {
    System.out.println(matcher.group(0));
    }else {
    System.out.println(matcher.group(0));
    }
    }
    }

    该例子中正则表达式.代表除回车的任意字符,*代表匹配任意多个(+也可以)

     

     

    什么是 RegExp?

    RegExp 是正则表达式(Regular expression)的缩写,作用是对字符串执行模式匹配。

    通常用于格式验证、正则替换、查找子串等

    各种编程语言的正则表达式基本相同,不同的语言可能会有一些细小的差别

    RegExp 语法

    1.// 直接实例化

    2.var reg = new RegExp(pattern [, flags])

    3.// 隐式创建(推荐)

    4.var reg = /pattern/flags;

    参数 pattern 是一个字符串,指定了正则表达式的模式或其他正则表达式。

    参数 [, flags] 是一个可选的字符串,包含属性 “g”(global )、”i” (ignoreCase)和 “m”(multiline)。

    ECMAScript 标准化之前,不支持 m 属性。如果 pattern 是正则表达式,而不是字符串,则必须省略该参数。

    概念:子表达式

    在正则表达式中,使用括号括起来的内容是一个子表达式,子表达式匹配到的内容会被系统捕获至缓冲区,使用\n(n:数字)来反向引用系统的第n号缓冲区的内容。

    场景:后面的内容要求与前面的一致,可以使用子表达式

    1.// 查找连续相同的四个数字

    2.var str = "1212ab45677778cd";

    3.var reg = /(\d)\1\1\1/gi;

    4.console.log(str.match(reg));

    5.// OUTPUT:7777

    概念:方括号(字符簇)

    1.var str = "Is this all there is?";
    2.var patt1 = /[a-h]/g;
    3.document.write(str.match(patt1));
    4.// OUTPUT:h,a,h,e,e

    方括号 作用

     

    方括号 作用
    [abc] 查找方括号之间的任何字符。
    [^abc] 查找任何不在方括号之间的字符。
    [0-9] 查找任何从 0 至 9 的数字。同 \d
    [a-z] 查找任何从小写 a 到小写 z 的字符。
    [A-Z] 查找任何从大写 A 到大写 Z 的字符。
    [A-z] 查找任何从大写 A 到小写 z 的字符。
    [0-9a-zA-Z] 查找0-9,a-z,A-Z

     

    概念:元字符

    元字符(Metacharacter)是拥有特殊含义的字符:

    元字符 | 作用 
    —|— 
    \ | 转义符 (、)、/、\ 
    | | 选择匹配符,可以匹配多个规则 
    . | 查找单个字符,除了换行和行结束符。 
    \w | 查找单词字符。字符 ( 字母 ,数字,下划线_ ) 
    \W | 查找非单词字符。 
    \d | 查找数字。 
    \D | 查找非数字字符。 
    \s | 查找空白字符。空格 
    \S | 查找非空白字符。 
    \b | 匹配单词边界。 
    \B | 匹配非单词边界。 
    \0 | 查找 NUL 字符。 
    \n | 查找换行符。 
    \f | 查找换页符。 
    \r | 查找回车符。 
    \t | 查找制表符。 
    \v | 查找垂直制表符。 
    \xxx | 查找以八进制数 xxx 规定的字符。 
    \xdd | 查找以十六进制数 dd 规定的字符。 
    \uxxxx | 查找以十六进制数 xxxx 规定的 Unicode 字符。

    概念:量词

     

    量词 作用
    n+ 匹配任何包含至少一个 n 的字符串。同 {1,}
    n* 匹配任何包含零个或多个 n 的字符串。同 {0,}
    n? 匹配任何包含零个或一个 n 的字符串。同 {0,1}
    n{X} 匹配包含 X 个 n 的序列的字符串。
    n{X,Y} 匹配包含 X 至 Y 个 n 的序列的字符串。
    n{X,} 匹配包含至少 X 个 n 的序列的字符串。
    n$ 匹配任何结尾为 n 的字符串。
    ^n 匹配任何开头为 n 的字符串。注意 /[^a] / 和 /^ [a]/是不一样的,前者是排除的,后者是代表首位。
    (?=n) 匹配任何其后紧接指定字符串 n 的字符串。正向预查
    (?!n) 匹配任何其后没有紧接指定字符串 n 的字符串。反向预查

     

    RegExp 对象方法

    test()

    test() 方法检索字符串中是否存在指定的值。返回值是 true 或 false。

    1.var patt1 = new RegExp('e');
    2.console.log(patt1.test('some text'));
    3.// OUTPUT:true
    4.var patt2 = new RegExp('ee');
    5.console.log(patt2.test('some text'));
    6.// OUTPUT:false

    1.// 判断是不是QQ号
    2.// 1 首位不能是0  ^[1-9]
    3.// 2 必须是 [5, 11] 位的数字 \d{4, 9}
    4.var str = '80583600';
    5.var regexp = /^[1-9][0-9]{4,10}$/gim;
    6.if (regexp.test(str)) {
    7.    alert('is');
    8.} else {
    9.    alert('no');
    10.}

    exec()

    exec() 方法检索字符串中的指定值。返回值是被找到的值。如果没有发现匹配,则返回 null。

    1.var patt1 = new RegExp('e');
    2.console.log(patt1.exec('some text'));
    3.// OUTPUT:e
    4.var patt2 = new RegExp('ee');
    5.console.log(patt2.exec('some text'));
    6.// OUTPUT:null

    compile()

    compile() 既可以改变检索模式,也可以添加或删除第二个参数。

    1.var patt1=new RegExp("e");
    2.document.write(patt1.test("The best things in life are free")); // true
    3.// 改变了检索模式
    4.patt1.compile("eee");
    5.document.write(patt1.test("The best things in life are free")); // false
    支持正则表达式的 String 对象的方法

    search 检索与正则表达式相匹配的值。

    1.var str = "Visit W3School!"
    2.console.log(str.search(/W3School/))
    3.// OUTPUT:6
    match 找到一个或多个正则表达式的匹配。

    1.var str="1 plus 2 equal 3"
    2.console.log(str.match(/\d+/g))
    3.// OUTPUT:1,2,3
    replace 替换与正则表达式匹配的子串。

    1.var str = "Visit Microsoft!"
    2.console.log(str.replace(/Microsoft/, "W3School"));
    3.// OUTPUT:Visit W3School!
    1.// 找重复项最多的字符个数
    2.var str = 'g21ss4aeba_ersb43sgnnsssstht6sss60snnsj8resw0_ss';
    3.// split : 将字符串转化为数组
    4.// sort : 对数组排序,ASCII
    5.// join : 将数组转化为字符串
    6.var str_new = str.split('').sort().join('');
    7.document.write(str + '<br>');
    8.document.write(str.split('') + '<br>');
    9.document.write(str.split('').sort() + '<br>');
    10.document.write(str.split('').sort().join('') + '<br>');
    11.// 匹配字符,且重复这个字符,重复次数至少一次。
    12.var regexp = /(\w)\1+/g;
    13.var index = 0;
    14.var value = '';
    15.str_new.replace(regexp, function($0, $1) {
    16.    // document.write($0);
    17.    // document.write($1);
    18.    if (index < $0.length) {
    19.        index = $0.length;
    20.        value = $1;
    21.    }
    22.});
    23.document.write('重复项最多的字符是:' + value + ',个数是:' + index);
    24.// OUTPUT:
    25.// 0012344668__aabbeeegghjnnnnrrssssssssssssssssttw
    26.// 重复项最多的字符是:s,个数是:16
    split 把字符串分割为字符串数组。

    1.var str = "How are you doing today?"
    2.document.write(str.split(/\s+/));
    3.// OUTPUT:How,are,you,doing,today?

    经验:

    检验格式(邮箱格式、IP格式)是否正确,用test() 
    抓取星期(如所有手机号),用exec()、match() 
    替换敏感词汇,用replace()

    常见的 正则表达式 校验

    1.// 常见的 正则表达式 校验
    2.// QQ号、手机号、Email、是否是数字、去掉前后空格、是否存在中文、邮编、身份证、URL、日期格式、IP
    3.var myRegExp = {
    4.    // 检查字符串是否为合法QQ号码
    5.    isQQ: function(str) {
    6.        // 1 首位不能是0  ^[1-9]
    7.        // 2 必须是 [5, 11] 位的数字  \d{4, 9}
    8.        var reg = /^[1-9][0-9]{4,9}$/gim;
    9.        if (reg.test(str)) {
    10.            console.log('QQ号码格式输入正确');
    11.            return true;
    12.        } else {
    13.            console.log('请输入正确格式的QQ号码');
    14.            return false;
    15.        }
    16.    },
    17.    // 检查字符串是否为合法手机号码
    18.    isPhone: function(str) {
    19.        var reg = /^(0|86|17951)?(13[0-9]|15[012356789]|18[0-9]|14[57]|17[678])[0-9]{8}$/;
    20.        if (reg.test(str)) {
    21.            console.log('手机号码格式输入正确');
    22.            return true;
    23.        } else {
    24.            console.log('请输入正确格式的手机号码');
    25.            return false;
    26.        }
    27.    },
    28.    // 检查字符串是否为合法Email地址
    29.    isEmail: function(str) {
    30.        var reg = /^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/;
    31.        // var reg = /\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/;
    32.        if (reg.test(str)) {
    33.            console.log('Email格式输入正确');
    34.            return true;
    35.        } else {
    36.            console.log('请输入正确格式的Email');
    37.            return false;
    38.        }
    39.    },
    40.    // 检查字符串是否是数字
    41.    isNumber: function(str) {
    42.        var reg = /^\d+$/;
    43.        if (reg.test(str)) {
    44.            console.log(str + '是数字');
    45.            return true;
    46.        } else {
    47.            console.log(str + '不是数字');
    48.            return false;
    49.        }
    50.    },
    51.    // 去掉前后空格
    52.    trim: function(str) {
    53.        var reg = /^\s+|\s+$/g;
    54.        return str.replace(reg, '');
    55.    },
    56.    // 检查字符串是否存在中文
    57.    isChinese: function(str) {
    58.        var reg = /[\u4e00-\u9fa5]/gm;
    59.        if (reg.test(str)) {
    60.            console.log(str + ' 中存在中文');
    61.            return true;
    62.        } else {
    63.            console.log(str + ' 中不存在中文');
    64.            return false;
    65.        }
    66.    },
    67.    // 检查字符串是否为合法邮政编码
    68.    isPostcode: function(str) {
    69.        // 起始数字不能为0,然后是5个数字  [1-9]\d{5}
    70.        var reg = /^[1-9]\d{5}$/g;
    71.        // var reg = /^[1-9]\d{5}(?!\d)$/;
    72.        if (reg.test(str)) {
    73.            console.log(str + ' 是合法的邮编格式');
    74.            return true;
    75.        } else {
    76.            console.log(str + ' 是不合法的邮编格式');
    77.            return false;
    78.        }
    79.    },
    80.    // 检查字符串是否为合法身份证号码
    81.    isIDcard: function(str) {
    82.        var reg = /^(^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$)|(^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])((\d{4})|\d{3}[Xx])$)$/;
    83.        if (reg.test(str)) {
    84.            console.log(str + ' 是合法的身份证号码');
    85.            return true;
    86.        } else {
    87.            console.log(str + ' 是不合法的身份证号码');
    88.            return false;
    89.        }
    90.    },
    91.    // 检查字符串是否为合法URL
    92.    isURL: function(str) {
    93.        var reg = /^https?:\/\/(([a-zA-Z0-9_-])+(\.)?)*(:\d+)?(\/((\.)?(\?)?=?&?[a-zA-Z0-9_-](\?)?)*)*$/i;
    94.        if (reg.test(str)) {
    95.            console.log(str + ' 是合法的URL');
    96.            return true;
    97.        } else {
    98.            console.log(str + ' 是不合法的URL');
    99.            return false;
    100.        }
    101.    },
    102.    // 检查字符串是否为合法日期格式 yyyy-mm-dd
    103.    isDate: function(str) {
    104.        var reg = /^[1-2][0-9][0-9][0-9]-[0-1]{0,1}[0-9]-[0-3]{0,1}[0-9]$/;
    105.        if (reg.test(str)) {
    106.            console.log(str + ' 是合法的日期格式');
    107.            return true;
    108.        } else {
    109.            console.log(str + ' 是不合法的日期格式,yyyy-mm-dd');
    110.            return false;
    111.        }
    112.    },
    113.    // 检查字符串是否为合法IP地址
    114.    isIP: function(str) {
    115.        // 1.1.1.1  四段  [0 , 255]
    116.        // 第一段不能为0
    117.        // 每个段不能以0开头
    118.        //
    119.        // 本机IP: 58.50.120.18 湖北省荆州市 电信
    120.        var reg = /^([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3}$/gi;
    121.        if (reg.test(str)) {
    122.            console.log(str + ' 是合法的IP地址');
    123.            return true;
    124.        } else {
    125.            console.log(str + ' 是不合法的IP地址');
    126.            return false;
    127.        }
    128.    }
    129.}
    130.// 测试
    131.// console.log(myRegExp.isQQ('80583600'));
    132.// console.log(myRegExp.isPhone('17607160722'));
    133.// console.log(myRegExp.isEmail( '11111@qq.com' ));
    134.// console.log(myRegExp.isNumber('100a'));
    135.// console.log(myRegExp.trim('  100  '));
    136.// console.log(myRegExp.isChinese('baixiaoming'));
    137.// console.log(myRegExp.isChinese('小明'));
    138.// console.log(myRegExp.isPostcode('412345'));
    139.// console.log(myRegExp.isIDcard('42091119940927001X'));
    140.// console.log(myRegExp.isURL('https://www.baidu.com/'));
    141.// console.log(myRegExp.isDate('2017-4-4'));
    142.// console.log(myRegExp.isIP('1.0.0.0'));

    一、校验数字的表达式

    1.数字:^[0-9]*$
    2.n位的数字:^\d{n}$
    3.至少n位的数字:^\d{n,}$
    4.m-n位的数字:^\d{m,n}$
    5.零和非零开头的数字:^(0|[1-9][0-9]*)$
    6.非零开头的最多带两位小数的数字:^([1-9][0-9]*)+(.[0-9]{1,2})?$
    7.带1-2位小数的正数或负数:^(\-)?\d+(\.\d{1,2})?$
    8.正数、负数、和小数:^(\-|\+)?\d+(\.\d+)?$
    9.有两位小数的正实数:^[0-9]+(.[0-9]{2})?$
    10.有1~3位小数的正实数:^[0-9]+(.[0-9]{1,3})?$
    11.非零的正整数:^[1-9]\d*$ 或 ^([1-9][0-9]*){1,3}$ 或 ^\+?[1-9][0-9]*$
    12.非零的负整数:^\-[1-9][]0-9"*$ 或 ^-[1-9]\d*$
    13.非负整数:^\d+$ 或 ^[1-9]\d*|0$
    14.非正整数:^-[1-9]\d*|0$ 或 ^((-\d+)|(0+))$
    15.非负浮点数:^\d+(\.\d+)?$ 或 ^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$
    16.非正浮点数:^((-\d+(\.\d+)?)|(0+(\.0+)?))$ 或 ^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0+|0$
    17.正浮点数:^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$ 或 ^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$
    18.负浮点数:^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$ 或 ^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$
    19.浮点数:^(-?\d+)(\.\d+)?$ 或 ^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$

    二、校验字符的表达式

    1.汉字:^[\u4e00-\u9fa5]{0,}$
    2.英文和数字:^[A-Za-z0-9]+$ 或 ^[A-Za-z0-9]{4,40}$
    3.长度为3-20的所有字符:^.{3,20}$
    4.由26个英文字母组成的字符串:^[A-Za-z]+$
    5.由26个大写英文字母组成的字符串:^[A-Z]+$
    6.由26个小写英文字母组成的字符串:^[a-z]+$
    7.由数字和26个英文字母组成的字符串:^[A-Za-z0-9]+$
    8.由数字、26个英文字母或者下划线组成的字符串:^\w+$ 或 ^\w{3,20}$
    9.中文、英文、数字包括下划线:^[\u4E00-\u9FA5A-Za-z0-9_]+$
    10.可以输入含有^%&',;=?$\"等字符:[^%&',;=?$\x22]+
    11.禁止输入含有~的字符:[^~\x22]+

    三、特殊需求表达式

    1.Email地址:^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$
    2.域名:[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(/.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+/.?
    3.InternetURL:[a-zA-z]+://[^\s]* 或 ^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$
    4.手机号码:^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$
    5.电话号码("XXX-XXXXXXX"、"XXXX-XXXXXXXX"、"XXX-XXXXXXX"、"XXX-XXXXXXXX"、"XXXXXXX"和"XXXXXXXX):^(\(\d{3,4}-)|\d{3.4}-)?\d{7,8}$
    6.国内电话号码(0511-4405222、021-87888822):\d{3}-\d{8}|\d{4}-\d{7}
    7.身份证号(15位、18位数字):^\d{15}|\d{18}$
    8.短身份证号码(数字、字母x结尾):^([0-9]){7,18}(x|X)?$ 或 ^\d{8,18}|[0-9x]{8,18}|[0-9X]{8,18}?$
    9.帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$
    10.密码(以字母开头,长度在6~18之间,只能包含字母、数字和下划线):^[a-zA-Z]\w{5,17}$
    11.强密码(必须包含大小写字母和数字的组合,不能使用特殊字符,长度在8-10之间):^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$
    12.日期格式:^\d{4}-\d{1,2}-\d{1,2}
    13.一年的12个月(01~09和1~12):^(0?[1-9]|1[0-2])$
    14.一个月的31天(01~09和1~31):^((0?[1-9])|((1|2)[0-9])|30|31)$
    15.xml文件:^([a-zA-Z]+-?)+[a-zA-Z0-9]+\\.[x|X][m|M][l|L]$
    16.中文字符的正则表达式:[\u4e00-\u9fa5]
    17.双字节字符:[^\x00-\xff]    (包括汉字在内,可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1))
    18.空白行的正则表达式:\n\s*\r    (可以用来删除空白行)
    19.HTML标记的正则表达式:<(\S*?)[^>]*>.*?</\1>|<.*? />    (网上流传的版本太糟糕,上面这个也仅仅能部分,对于复杂的嵌套标记依旧无能为力)
    20.首尾空白字符的正则表达式:^\s*|\s*$或(^\s*)|(\s*$)    (可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式)
    21.腾讯QQ号:[1-9][0-9]{4,}    (腾讯QQ号从10000开始)
    22.中国邮政编码:[1-9]\d{5}(?!\d)    (中国邮政编码为6位数字)
    23.IP地址:\d+\.\d+\.\d+\.\d+    (提取IP地址时有用)
    24.IP地址:((?:(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d))

    钱的输入格式:

    1.1.有四种钱的表示形式我们可以接受:"10000.00" 和 "10,000.00", 和没有 "分" 的 "10000" 和 "10,000":^[1-9][0-9]*$
    2.2.这表示任意一个不以0开头的数字,但是,这也意味着一个字符"0"不通过,所以我们采用下面的形式:^(0|[1-9][0-9]*)$
    3.3.一个0或者一个不以0开头的数字.我们还可以允许开头有一个负号:^(0|-?[1-9][0-9]*)$
    4.4.这表示一个0或者一个可能为负的开头不为0的数字.让用户以0开头好了.把负号的也去掉,因为钱总不能是负的吧.下面我们要加的是说明可能的小数部分:^[0-9]+(.[0-9]+)?$
    5.5.必须说明的是,小数点后面至少应该有1位数,所以"10."是不通过的,但是 "10" 和 "10.2" 是通过的:^[0-9]+(.[0-9]{2})?$
    6.6.这样我们规定小数点后面必须有两位,如果你认为太苛刻了,可以这样:^[0-9]+(.[0-9]{1,2})?$
    7.7.这样就允许用户只写一位小数.下面我们该考虑数字中的逗号了,我们可以这样:^[0-9]{1,3}(,[0-9]{3})*(.[0-9]{1,2})?$
    8.8.1到3个数字,后面跟着任意个 逗号+3个数字,逗号成为可选,而不是必须:^([0-9]+|[0-9]{1,3}(,[0-9]{3})*)(.[0-9]{1,2})?$
    9.备注:这就是最终结果了,别忘了"+"可以用"*"替代如果你觉得空字符串也可以接受的话(奇怪,为什么?)最后,别忘了在用函数时去掉去掉那个反斜杠,一般的错误都在这里

    展开全文
  • 1.什么是正则表达式的贪婪与非贪婪匹配 如:String str="abcaxc"; Patter p="ab.*c"; 贪婪匹配:正则表达式一般趋向于最大长度匹配,也就是所谓的贪婪匹配。如上面使用模式p匹配字符串str,结果就是匹配到:abcaxc...

    1.什么是正则表达式的贪婪与非贪婪匹配
      如:String str="abcaxc";
        Patter p="ab.*c";
      贪婪匹配:正则表达式一般趋向于最大长度匹配,也就是所谓的贪婪匹配。如上面使用模式p匹配字符串str,结果就是匹配到:abcaxc(ab.*c)。
      非贪婪匹配:就是匹配到结果就好,就少的匹配字符。如上面使用模式p匹配字符串str,结果就是匹配到:abc(ab.*c)。
    2.编程中如何区分两种模式
      默认是贪婪模式;在量词后面直接加上一个问号?就是非贪婪模式。
      量词:{m,n}:m到n个
         *:任意多个
         +:一个到多个
         ?:0或一个
    3.程序实例

    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    public class RegularTest {
        
        public static void main(String[] arg){
            String text="(content:\"rcpt to root\";pcre:\"word\";)";
            String rule1="content:\".+\"";    //贪婪模式
            String rule2="content:\".+?\"";    //非贪婪模式
            
            System.out.println("文本:"+text);
            System.out.println("贪婪模式:"+rule1);
            Pattern p1 =Pattern.compile(rule1);
            Matcher m1 = p1.matcher(text);
            while(m1.find()){
                System.out.println("匹配结果:"+m1.group(0));
            }
            
            System.out.println("非贪婪模式:"+rule2);
            Pattern p2 =Pattern.compile(rule2);
            Matcher m2 = p2.matcher(text);
            while(m2.find()){
                System.out.println("匹配结果:"+m2.group(0));
            }
        }
    }

    执行结果:

     4.例题:

    Java中用正则表达式截取字符串中第一个出现的英文左括号之前的字符串。比如:北京市(海淀区)(朝阳区)(西城区),截取结果为:北京市。正则表达式为()

    答:".*?(?=\\()"
      解析:(?=Expression) 顺序环视,(?=\\()就是匹配正括号
      懒惰模式正则: 
      src=".*? (?=\\() "
      结果:北京市
      因为匹配到第一个"就结束了一次匹配。不会继续向后匹配。因为他懒惰嘛。

    转载于:https://www.cnblogs.com/Archer-Fang/p/10256134.html

    展开全文
  • 正则表达式贪婪模式与非贪婪模式

    千次阅读 2015-10-13 14:55:12
    1.定义:什么是贪婪模式与非贪婪模式 string str="abcaxc"; string regex="ab\w*c"; 贪婪与非贪婪模式影响的是被量词修饰的子表达式的匹配行为。 贪婪匹配 :贪婪模式在整个表达式匹配成功的提前下,尽可能...

    1.定义:什么是贪婪模式与非贪婪模式

    string str="abcaxc";
    string regex="ab\w*c";

    贪婪与非贪婪模式影响的是被量词修饰的子表达式的匹配行为。
    贪婪匹配 :贪婪模式在整个表达式匹配成功的提前下,尽可能多的匹配。即,正则表达式一般趋于最大长度匹配。如果用regex匹配str(Regex.Match(str,regex)),结果为abcaxc。
    非贪婪匹配:在整个表达式匹配成功的前提下,以最少的匹配字符。如果使用regex匹配str(Regex.Match(str.regex)),结果为abc。

    2.如何区分两种模式

    默认是贪婪模式;在量词后面直接加上一个问号?就是非贪婪模式。

    量词:{M,N} :最少M个,最多N个
    *:任意多个
    +:一个到多个
    ?:0或一个


    下面直接百度的,暂时没时间看了。

    3.零宽断言编辑

    用于查找在某些内容(但并不包括这些内容)之前或之后的东西,也就是说它们像\b,^,$那样用于指定一个位置,这个位置应该满足一定的条件(即断言),因此它们也被称为零宽断言。最好还是拿例子来说明吧:
    (?=exp)也叫零宽度正预测先行断言[4]  ,它断言自身出现的位置的后面能匹配表达式exp。比如\b\w+(?=ing\b),匹配以ing结尾的单词的前面部分(除了ing以外的部分),如查找I'm singing while you're dancing.时,它会匹配sing和danc。
    (?<=exp)也叫零宽度正回顾后发断言[4]  ,它断言自身出现的位置的前面能匹配表达式exp。比如(?<=\bre)\w+\b会匹配以re开头的单词的后半部分(除了re以外的部分),例如在查找reading a book时,它匹配ading。
    假如你想要给一个很长的数字中每三位间加一个逗号(当然是从右边加起了),你可以这样查找需要在前面和里面添加逗号的部分:((?<=\D)\D{3})+\b,用它对xxxxxxxxxx进行查找时结果是xxxxxxxxx
    下面这个例子同时使用了这两种断言:(?<=\s)\d+(?=\s)匹配以空白符间隔的数字(再次强调,不包括这些空白符)
    断言用来声明一个应该为真的事实。正则表达式中只有当断言为真时才会继续进行匹配。

    4.负向零宽编辑

    如果我们只是想要确保某个字符没有出现,但并不想去匹配它时怎么办?例如,如果我们想查找这样的单词--它里面出现了字母q,但是q后面跟的不是字母u,我们可以尝试这样:
    \b\w*q[^u]\w*\b匹配包含后面不是字母u的字母q的单词。但是如果多做测试(或者你思维足够敏锐,直接就观察出来了),你会发现,如果q出现在单词的结尾的话,像Iraq,Benq,这个表达式就会出错。这是因为[^u]总要匹配一个字符,所以如果q是单词的最后一个字符的话,后面的[^u]将会匹配q后面的单词分隔符(可能是空格,或者是句号或其它的什么),后面的\w*\b将会匹配下一个单词,于是\b\w*q[^u]\w*\b就能匹配整个Iraq fighting。负向零宽断言能解决这样的问题,因为它只匹配一个位置,并不消费任何字符。,我们可以这样来解决这个问题:\b\w*q(?!u)\w*\b。
    零宽度负预测先行断言(?!exp),断言此位置的后面不能匹配表达式exp。例如:\d{3}(?!\d)匹配三位数字,而且这三位数字的后面不能是数字;\b((?!abc)\w)+\b匹配不包含连续字符串abc的单词。
    同理,我们可以用(?<!exp),零宽度负回顾后发断言来断言此位置的前面不能匹配表达式exp:(?<![a-z])\d{7}匹配前面不是小写字母的七位数字。
    请详细分析表达式(?<=<(\w+)>).*(?=<\/\1>),这个表达式最能表现零宽断言的真正用途。
    一个更复杂的例子:(?<=<(\w+)>).*(?=<\/\1>)匹配不包含属性的简单HTML标签内里的内容。(?<=<(\w+)>)指定了这样的前缀:被尖括号括起来的单词(比如可能是<b>),然后是.*(任意的字符串),最后是一个后缀(?=<\/\1>)。注意后缀里的\/,它用到了前面提过的字符转义,将”/“转义;\1则是一个反向引用,引用的正是捕获的第一组,前面的(\w+)匹配的内容,这样如果前缀实际上是<b>的话,后缀就是</b>了。整个表达式匹配的是<b>和</b>之间的内容(再次提醒,不包括前缀和后缀本身)。

    5.启示编辑

    (1) 心中时刻保持新颖想法,尝试用各种新办法来解决遇到的问题。对于遇到的问题,在用常规的解决思路无法解决或不能很好解决的时候,可以大胆探索尝试采用新的方法或思路来解决问题,说大点就是创新!没有新思路估计今天的正则表达式还要等几百年才能露现人间。
    (2) 善于学习和借鉴前人的经验和成果,UNIX鼻祖Ken Thompson是什么样子的人?是被计算机界尊称为“UNIX之父”的大师级别的人物,大师都在不断思考从其它学科、其它知识领域的工作成果,来改进自己的工作或程序,事实也证明这样做取得巨大结果和后来的深远影响是事先谁也无法预估到的,我们在做一些事情或研究的时间,是否也考虑学习大师的优秀习惯?
    (3) 学好数学、英语并保持对数学、英语的兴趣,数学也是人类几千年积累的智慧结晶,学习数学知识可以培养和训练人的思维能力。看这篇文章的朋友,我想很多都是计算机相关专业的朋友,至于数学和英语对于计算机学习和发展的重要性的道理,这里就不在多说,重在实践加持之以恒!
    (4) 养成独立思考的习惯。上学时候老师经常说人与动物的最大区别是人能思考。拉美洲有句关于“思考”的谚语是,不会思考的人是白痴,不肯思考的人是懒汉,不敢思考的人是奴隶。我想大家和我一样,既不愿做懒汉、奴隶,更不愿做白痴。所以相信正则分享网的朋友们一定会选择做一个“会思、肯思、敢思”的人。
    (5) 当正则表达式和字符串函数都能解决问题时,一定要使用字符串函数,这样不容易出错,最重要的是字符串函数比正则表达式实现性能上要好得多。[1] 

    展开全文
  • 非贪婪模式:在整个表达式成功的前提下,尽可能少的匹配。 举个栗子: >>> content = "abbbbbbbbbbbbbbbsa" >>> res = re.compile("ab+") >>> res.findall(content) #贪婪模式 ['abbbb...
  • python贪婪和非贪婪  正则表达式通常用于在文本中查找匹配的字符串。Python里数量词默认是贪婪的(在少数语言里也可能是默认非贪婪),总是尝试匹配尽可能多的字符;非贪婪则相反,总是尝试匹配尽可能少的字符。在...
  • 网上找到的贪婪与非贪婪模式详解,看了这一段基本明白贪婪与非贪婪模式的构成条件。 1 概述  贪婪与非贪婪模式影响的是被量词修饰的子表达式的匹配行为,贪婪模式在整个表达式匹配成功的前提下,尽可能多...
  • 提取html中的tag,需要用正则的非贪婪匹配法
  • 非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。  . 匹配除 "\n" 之外的任何单个字符。要匹配包括 '\n' 在内的任何字符,请使用象 '[.\n]' 的模式。  (pattern) ...
  • 由于sed 不支持非贪婪匹配我们采用perl来达到替换的目的,需要处理的数据如下所示 INSERT INTO `players` (`dbid`, `account`... `position`) VALUES (223338299393,'zhulangren',13... 我们目的是要删除 `...
  • 目录 一:元字符 示例1:匹配:四位整数六位小数的一个数字,如3467.798789: 示例2:匹配杭州与宁波的座机号码(0571|0574-XXXXXXXX...非贪婪模式 五:表达式分组 示例1:匹配验证码(4位或6位): 示例2:匹配
  • re.match() 能够匹配出以xxx开头的字符串 匹配单个字符 示例1: . ...需求:匹配出,8到20位的密码,可以是大小写英文字母、数字、下划线 ...python贪婪和非贪婪 ...非贪婪则相反,总是尝试匹配尽可能少的...
  • 贪婪算法

    千次阅读 2018-08-29 10:24:25
    NP的英文全称是Non-deterministic Polynomial的问题,即多项式复杂程度的确定性问题。简单的写法是 NP=P?,问题就在这个问号上,到底是NP等于P,还是NP不等于P。。。。。。。 具体的详细描述可以参考百度百科...
  • \S 空白字符 [^ ] ( 和 ) \l 小写字母 [a-z] \L 小写字母 [^a-z] \u 大写字母 [A-Z] \U 大写字母 [^A-Z] & 所有查找时匹配到的东西 \[Ee] 更改大小写的选择区域的终点 :%s/\s\+$// 删除行尾多余的...
  • vim 贪婪

    2011-06-16 00:37:00
    关于Vim的模式匹配 模式开关 ...当使用/............大家都知道,模式匹配中有一些特殊字符,它们对如何进行字符匹配起着关键性的作用。...因为在默认情况下,Vim将...b”进行匹配(非贪婪),而在Vim中要写成“a./{-}b”。
  • C#正则表达式之贪婪模式

    千次阅读 2013-07-28 23:21:46
    1、贪婪模式演示:(当提取多个...• 非贪婪:.+?。(尽可能的少匹配,(1个。)) 2、从文本提取出名字:Match match = Regex.Match("大家好。我是S.H.E。我22岁了。我病了,呜呜。fffff","我是(.+)。");//没有加^
  • 算法图解part8:贪婪算法

    千次阅读 2019-06-18 22:25:38
    算法图解part8:贪婪算法
  • 正则有不同的匹配模式,有三种模式,第一:贪婪匹配,第二:非贪婪匹配,第三:独占模式 主要区别在于匹配是一次还是多次,长度尽量长还是尽量短 看到这个次数次数的,我们回顾一下量词的定义: ...
  • GPSR:贪婪转发与周边转发

    千次阅读 2019-03-05 16:14:42
    博客主题推荐:Theme Art Design,“笔记记录+搭建知识体系”的利器。 这是之前学习《无线传感网络》这门课做的期末大作业,GPSR是"...这是一种无状态的路由转发协议,巧妙地借助“贪婪转发”和“周边转发”有效...
  • 在Flex中利用正则验证录入,把以前在c#、javascript中用过的正则表达式在flex中正则不起作用。经过大量验证试验发现只要...非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。
  • 目录 教室调度问题​ 集合覆盖问题​ 背包问题​ 如何识别 NP 完全问题 小结 NP完全问题 一、时间复杂度 二、多项式时间或多项式复杂度 三、P型问题与NP型问题 ...但这正是贪婪算法的优点...
  • 贪婪算法、分治算法、动态规划 以及相关的荔枝等; 【1】贪婪算法 1)intro: 贪婪算法是分阶段进行的,在每个阶段,可以认为所做的决定是最好的,而不考虑将来的后果; 2)我们已经看到过的贪婪算法有: alg1)...
  • 打开PPT全英文读了几遍,没有老师的讲解英文继续劝退。最后还是打开了我中文版的《算法导论》。 总之,算法导论的解释最清晰、最基础,《数据结构、算法与应用》因为不涉及基本定理的证明,只注重了文字化逻辑推导,...
  • 五、正则表达式贪婪与非贪婪模式 如: String str=”12c3b3”;   Patter p=”12.*3”; 贪婪匹配: 正则表达式一般趋向于最大长度匹配,也就是所谓的贪婪匹配。如上面使用模式p匹配字符串str,结果就是...
  • 造成这种差异的原因是,在旅行商问题中,我们需要规划联通所有城市的最短路径,这涉及到的是序列,而无序的集合(广播台问题涉及了集合),所以是排列问题而组合问题。 集合覆盖问题和旅行商问题都是NP完全...
  • 周末快到了,今天为大家送上一篇很有意思的小文章,... 英文字母大小写2. 数字3. 越南文4. 一些特殊字符,如“&amp;”,“-”,“_”等看到这个要求的时候,自然而然地想到了正则表达式。于是就有了下面的表达式...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 13,999
精华内容 5,599
关键字:

英文非贪婪