精华内容
下载资源
问答
  • 文章目录构造正则表达式regex_search()只查找到第一个匹配的子序列使用regex_iterator匹配所有子串regex_match全文匹配regex_replace 要使用regex库,要包含头文件#include <regex> 构造正则表达式 构造正则...

    C++11正式加入了regex库,下面通过几个简单的例子介绍一下regex库的使用。

    要使用regex库,要包含头文件#include <regex>
    在这里插入图片描述

    构造正则表达式

    构造正则表达式用到一个类:basic_regex。basic_regex是一个正则表达式的通用类模板,对char和wchar_t类型都有对应的特化:

    typedef basic_regex<char>    regex;
    typedef basic_regex<wchar_t> wregex;
    

    构造函数比较多,但是非常简单:

    //默认构造函数,将匹配任何的字符序列
    basic_regex();
    //用一个以‘\0’结束的字符串s构造一个正则表达式
    explicit basic_regex( const CharT* s,flag_type f =std::regex_constants::ECMAScript );
    //同上,但是制定了用于构造的字符串s的长度为count
    basic_regex( const CharT* s, std::size_t count,flag_type f = std::regex_constants::ECMAScript );
    //拷贝构造,不赘述
    basic_regex( const basic_regex& other );
     //移动构造函数
    basic_regex( basic_regex&& other );
    //以basic_string类型的str构造正则表达式
    template< class ST, class SA >
    explicit basic_regex( const std::basic_string<CharT,ST,SA>& str, flag_type f = std::regex_constants::ECMAScript );
    //指定范围[first,last)内的字符串构造正则表达式
    template< class ForwardIt >
    basic_regex( ForwardIt first, ForwardIt last, flag_type f = std::regex_constants::ECMAScript );
    //使用initializer_list构造
    basic_regex( std::initializer_list<CharT> init, flag_type f = std::regex_constants::ECMAScript );
    

    以上除默认构造之外的构造函数,都有一个flag_type类型的参数用于指定正则表达式的语法,ECMASCRIPT、basic、extended、awk、grep和egrep均是可选的值。除此之外还有其他几种可能的的标志,用于改变正则表达式匹配时的规则和行为:

    在这里插入图片描述
    有了构造函数之后,现在我们就可以先构造出一个提取http链接的正则表达式:

    std::string pattern("http(s)?://([\\w-]+\\.)+[\\w-]+(/[\\w- ./?%&=]*)?");    //匹配规则很简单,如果有疑惑,可以对照语法查看
    std::regex r(pattern);
    

    值得一提的是在C++中’‘这个字符需要转义,因此所有ECMASCRIPT正则表达式语法中的’'都需要写成“\”的形式。我测试的时候,这段regex如果没有加转义,在gcc中会给出警告提示,vs2013编译后后运行直接崩溃了。

    regex_search()只查找到第一个匹配的子序列

    根据函数的字面语义,我们可能会错误的选择regex_search()这个函数来进行匹配。其函数原型也有6个重载的版本,用法也是大同小异,函数返回值是bool值,成功返回true,失败返回false。鉴于篇幅,我们只看我们下面要使用的这个:

    template< class STraits, class SAlloc,class Alloc, class CharT, class Traits >
    bool regex_search( const std::basic_string<CharT,STraits,SAlloc>& s,
                       std::match_results<typename std::basic_string<CharT,STraits,SAlloc>::const_iterator, Alloc>& m,
                       const std::basic_regex<CharT, Traits>& e,
                       std::regex_constants::match_flag_type flags = std::regex_constants::match_default );
    

    第一个参数s是std::basic_string类型的,它是我们待匹配的字符序列,参数m是一个match_results的容器用于存放匹配到的结果,参数e则是用来存放我们之前构造的正则表达式对象。flags参数值得一提,它的类型是std::regex_constants::match_flag_type,语义上匹配标志的意思。正如在构造正则表达式对象时我们可以指定选项如何处理正则表达式一样,在匹配的过程中我们依然可以指定另外的标志来控制匹配的规则。这些标志的具体含义,我从cppreference.com 引用过来,用的时候查一下就可以了:

    在这里插入图片描述
    根据参数类型,于是我们构造了这样的调用:

    std::smatch results;<br>regex_search(html,results,r);
    

    不过,标准库规定regex_search()在查找到第一个匹配的子串后,就会停止查找!在本程序中,results参数只带回了第一个满足条件的http链接。这显然并不能满足我们要提取网页中所有HTTP链接需要。

    使用regex_iterator匹配所有子串

    严格意义上regex_iterator是一种迭代器适配器,它用来绑定要匹配的字符序列和regex对象。regex_iterator的默认构造函数比较特殊,就直接构造了一个尾后迭代器。另外一个构造函数原型:

    regex_iterator(BidirIt a, BidirIt b,                                                           //分别是待匹配字符序列的首迭代器和尾后迭代器
                   const regex_type& re,                                                           //regex对象
                   std::regex_constants::match_flag_type m = std::regex_constants::match_default); //标志,同上面的regex_search()中的
    

    和上边的regex_search()一样,regex_iterator的构造函数中也有std::regex_constants::match_flag_type类型的参数,用法一样。其实regex_iterator的内部实现就是调用了regex_search(),这个参数是用来传递给regex_search()的。用gif或许可以演示的比较形象一点,具体是这样工作的(颜色加深部分,表示可以匹配的子序列):

    在这里插入图片描述
    首先在构造regex_iterator的时候,构造函数中首先就调用一次regex_search()将迭代器it指向了第一个匹配的子序列。以后的每一次迭代的过程中(++it),都会在以后剩下的子序列中继续调用regex_search(),直到迭代器走到最后。it就一直“指向”了匹配的子序列。

    知道了原理,我们写起来代码就轻松多了。结合前面的部分我们,这个程序就基本写好了:

    #include <iostream>
    #include <regex>
    #include <string>
     
    int main()
    {
        std::string tmp,html;
        while(getline(std::cin,tmp))
        {
            tmp += '\n';
            html += tmp;
        }
        std::string pattern("http(s)?://([\\w-]+\\.)+[\\w-]+(/[\\w- ./?%&=]*)?");
        pattern = "[[:alpha:]]*" + pattern + "[[:alpha:]]*";
        std::regex r(pattern);
        for (std::sregex_iterator it(html.begin(), html.end(), r), end;     //end是尾后迭代器,regex_iterator是regex_iterator的string类型的版本
            it != end;
            ++it)
        {
            std::cout << it->str() << std::endl;
        }
    }
    

    regex_match全文匹配

    cout << regex_match("123", regex("\\d")) << endl;		//结果为0
    cout << regex_match("123", regex("\\d+")) << endl;		//结果为1
    

    上述方法返回值为bool值,主要用于if条件表达式中。

    更多的时候我们希望能够获得匹配结果(字符串),对结果进行操作。这时就需要对匹配结果进行存储,共有两种存储方式。

    match_results<string::const_iterator> result;
    smatch result;			//推荐
    

    第二种方式使用起来更简洁、方便,推荐使用。

    下面看一个match方法匹配的实例,看看实际应用:

    string str = "Hello_2018";
    smatch result;
    regex pattern("(.{5})_(\\d{4})");	//匹配5个任意单字符 + 下划线 + 4个数字
    
    if (regex_match(str, result, pattern))
    {
    	cout << result[0] << endl;		//完整匹配结果,Hello_2018
    	cout << result[1] << endl;		//第一组匹配的数据,Hello
    	cout << result[2] << endl;		//第二组匹配的数据,2018
    	cout<<"结果显示形式2"<<endl;
    	cout<< result.str() << endl;	//完整结果,Hello_2018
    	cout<< result.str(1) << endl;	//第一组匹配的数据,Hello
    	cout << result.str(2) << endl;	//第二组匹配的数据,2018
    }
    
    //遍历结果
    for (int i = 0; i < result.size(); ++i)
    {
    	cout << result[i] << endl;
    }
    
    

    result[]与result.str()这两种方式能够获得相同的值,我更喜欢用数组形式的。

    在匹配规则中,以括号()的方式来划分组别,实例中的规则共有两个括号,所以共有两组数据。

    regex_replace

    replace是替换匹配,即可以将符合匹配规则的子字符串替换为其他字符串。

    string str = "Hello_2018!";
    regex pattern("Hello");	
    cout << regex_replace(str, pattern, "") << endl;	//输出:_2018,将Hello替换为""
    cout << regex_replace(str, pattern, "Hi") << endl;	//输出:Hi_2018,将Hello替换为Hi
    

    展开全文
  • 这篇文章的写作方式不是讲理论,而是通过具体的例子来了解正则,这样也更有实践性,在此基础上再去看正则表达式的基本概念会更有收获。 禁止分组的捕获 在正则中分组很有用,可以定义子模式,然后可以通过后向引用来...
  • 正则表达式详解

    2020-11-11 15:35:17
    正则表达式是一种文本模式,包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为“元字符”)。模式描述在搜索文本时要匹配的一个或多个字符串。 1.正则表达式基本语法 两个特殊的符号'^'和'$'。他们的作用...

    正则表达式是一种文本模式,包括普通字符(例如,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 οnkeyup="value=value.replace(/[\W]/g,'') " onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))" ID="Text1" NAME="Text1">

    2.只能输入数字的:

    <input οnkeyup="value=value.replace(/[^\d]/g,'') " onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))" ID="Text2" NAME="Text2">

    3.只能输入全角的:

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

    4.只能输入汉字的:

    <input οnkeyup="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到19位的字符串,它要求是由大小写字母、数字或者特殊字符集[._]组成。

    *******************************************************************************

    //校验用户姓名:只能输入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到正无穷吧。

    4.正则表达式的应用

    "^\d+$"  //非负整数(正整数 + 0) 
    "^[0-9]*[1-9][0-9]*$"  //正整数 
    "^((-\d+)|(0+))$"  //非正整数(负整数 + 0) 
    "^-[0-9]*[1-9][0-9]*$"  //负整数 
    "^-?\d+$"    //整数 
    "^\d+(\.\d+)?$"  //非负浮点数(正浮点数 + 0) 
    "^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$"  //正浮点数 
    "^((-\d+(\.\d+)?)|(0+(\.0+)?))$"  //非正浮点数(负浮点数 + 0) 
    "^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$"  //负浮点数 
    "^(-?\d+)(\.\d+)?$"  //浮点数 
    "^[A-Za-z]+$"  //由26个英文字母组成的字符串 
    "^[A-Z]+$"  //由26个英文字母的大写组成的字符串 
    "^[a-z]+$"  //由26个英文字母的小写组成的字符串 
    "^[A-Za-z0-9]+$"  //由数字和26个英文字母组成的字符串 
    "^\w+$"  //由数字、26个英文字母或者下划线组成的字符串 
    "^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$"    //email地址 
    "^[a-zA-z]+://(\w+(-\w+)*)(\.(\w+(-\w+)*))*(\?\S*)?$"  //url
    /^(d{2}|d{4})-((0([1-9]{1}))|(1[1|2]))-(([0-2]([1-9]{1}))|(3[0|1]))$/   //  年-月-日
    /^((0([1-9]{1}))|(1[1|2]))/(([0-2]([1-9]{1}))|(3[0|1]))/(d{2}|d{4})$/   // 月/日/年
    "^([w-.]+)@(([[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.)|(([w-]+.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(]?)$"   //Emil
    "(d+-)?(d{4}-?d{7}|d{3}-?d{8}|^d{7,8})(-d+)?"     //电话号码
    "^(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5])$"   //IP地址

    ^([0-9A-F]{2})(-[0-9A-F]{2}){5}$   //MAC地址的正则表达式
    ^[-+]?\d+(\.\d+)?$  //值类型正则表达式

    "^\\d+$"  //非负整数(正整数 + 0) 
    "^[0-9]*[1-9][0-9]*$"  //正整数 
    "^((-\\d+)|(0+))$"  //非正整数(负整数 + 0) 
    "^-[0-9]*[1-9][0-9]*$"  //负整数 
    "^-?\\d+$"    //整数 
    "^\\d+(\\.\\d+)?$"  //非负浮点数(正浮点数 + 0) 
    "^(([0-9]+\\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\\.[0-9]+)|([0-9]*[1-9][0-9]*))$"  //正浮点数 
    "^((-\\d+(\\.\\d+)?)|(0+(\\.0+)?))$"  //非正浮点数(负浮点数 + 0) 
    "^(-(([0-9]+\\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\\.[0-9]+)|([0-9]*[1-9][0-9]*)))$"  //负浮点数 
    "^(-?\\d+)(\\.\\d+)?$"  //浮点数 
    "^[A-Za-z]+$"  //由26个英文字母组成的字符串 
    "^[A-Z]+$"  //由26个英文字母的大写组成的字符串 
    "^[a-z]+$"  //由26个英文字母的小写组成的字符串 
    "^[A-Za-z0-9]+$"  //由数字和26个英文字母组成的字符串 
    "^\\w+$"  //由数字、26个英文字母或者下划线组成的字符串 
    "^[\\w-]+(\\.[\\w-]+)*@[\\w-]+(\\.[\\w-]+)+$"    //email地址 
    "^[a-zA-z]+://(\\w+(-\\w+)*)(\\.(\\w+(-\\w+)*))*(\\?\\S*)?$"  //url

     

     

    转自:OnlyLiu

    展开全文
  • 一、什么是正则表达式  正则表达式,又称正规表示法,是对字符串操作的一种逻辑公式。正则表达式可以检测给定的字符串是否符合我们定义的逻辑,也可以从字符串中获取我们想要的特定部分。它可以迅速地用极简单的...

    一、什么是正则表达式

      正则表达式,又称正规表示法,是对字符串操作的一种逻辑公式。正则表达式可以检测给定的字符串是否符合我们定义的逻辑,也可以从字符串中获取我们想要的特定部分。它可以迅速地用极简单的方式达到字符串的复杂控制。

     二、正则表达式的语法

      看一个过滤纯数字的例子

    - (BOOL)validateNumber:(NSString *) textString
    {
        NSString* number=@"^[0-9]+$";
        NSPredicate *numberPre = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",number];
        return [numberPre evaluateWithObject:textString];
    }

      其中下述语句就是一个正则表达式

    @"^[0-9]+$"

      它代表了字符串中只能包含>=1个0-9的数字,语法是不是有一些怪异?

      下面我们先撇开iOS中的正则表达式的语法,用通俗的正则表达式语法来为介绍一下。(iOS语法与通俗的正则表达式语法相同,不同在于对转义字符的处理上(语言类的都相同))

      语法:

      首先,特殊符号’^'和’$'。他们的作用是分别指出一个字符串的开始和结束。eg:

      “^one”:表示所有以”one”开始的字符串(”one cat”,”one123″,·····);

      类似于:- (BOOL)hasPrefix:(NSString *)aString;

      “a dog$”:表示所以以”a dog”结尾的字符串(”it is a dog”,·····);

      类似于:- (BOOL)hasSuffix:(NSString *)aString;

      “^apple$”:表示开始和结尾都是”apple”的字符串,这个是唯一的~;

      “banana”:表示任何包含”banana”的字符串。

      类似于 iOS8的新方法- (BOOL)containsString:(NSString *)aString,搜索子串用的。

      ‘*’,’+'和’?'这三个符号,表示一个或N个字符重复出现的次数。它们分别表示“没有或更多”([0,+∞]取整),“一次或更多”([1,+∞]取整),“没有或一次”([0,1]取整)。下面是几个例子:

      “ab*”:表示一个字符串有一个a后面跟着零个或若干个b(”a”, “ab”, “abbb”,……);

      “ab+”:表示一个字符串有一个a后面跟着至少一个b或者更多( ”ab”, “abbb”,……);

      “ab?”:表示一个字符串有一个a后面跟着零个或者一个b( ”a”, “ab”);

      “a?b+$”:表示在字符串的末尾有零个或一个a跟着一个或几个b( ”b”, “ab”,”bb”,”abb”,……)。

      可以用大括号括起来({}),表示一个重复的具体范围。例如

      “ab{4}”:表示一个字符串有一个a跟着4个b(”abbbb”);

      “ab{1,}”:表示一个字符串有一个a跟着至少1个b(”ab”,”abb”,”abbb”,……);

      “ab{3,4}”:表示一个字符串有一个a跟着3到4个b(”abbb”,”abbbb”)。

      那么,“*”可以用{0,}表示,“+”可以用{1,}表示,“?”可以用{0,1}表示

      注意:可以没有下限,但是不能没有上限!例如“ab{,5}”是错误的写法

      “ | ”表示“或”操作:

      “a|b”:表示一个字符串里有”a”或者”b”;

      “(a|bcd)ef”:表示”aef”或”bcdef”;

      “(a|b)*c”:表示一串”a”"b”混合的字符串后面跟一个”c”;

      方括号”[ ]“表示在括号内的众多字符中,选择1-N个括号内的符合语法的字符作为结果,例如

      “[ab]“:表示一个字符串有一个”a”或”b”(相当于”a|b”);

      “[a-d]“:表示一个字符串包含小写的’a'到’d'中的一个(相当于”a|b|c|d”或者”[abcd]“);

      “^[a-zA-Z]“:表示一个以字母开头的字符串;

      “[0-9]a”:表示a前有一位的数字;

      “[a-zA-Z0-9]$”:表示一个字符串以一个字母或数字结束。

      “.”匹配除“\r\n”之外的任何单个字符:

      “a.[a-z]“:表示一个字符串有一个”a”后面跟着一个任意字符和一个小写字母;

      “^.{5}$”:表示任意1个长度为5的字符串;

      “\num” 其中num是一个正整数。表示”\num”之前的字符出现相同的个数,例如

      “(.)\1″:表示两个连续的相同字符。

      “10\{1,2\}” : 表示数字1后面跟着1或者2个0 (“10″,”100″)。

      ” 0\{3,\} ” 表示数字为至少3个连续的0 (“000”,“0000”,······)。

      在方括号里用’^'表示不希望出现的字符,’^'应在方括号里的第一位。

      “@[^a-zA-Z]4@”表示两个”@”中不应该出现字母)。

      常用的还有:

      “ \d ”匹配一个数字字符。等价于[0-9]。

      “ \D”匹配一个非数字字符。等价于[^0-9]。

      “ \w ”匹配包括下划线的任何单词字符。等价于“[A-Za-z0-9_]”。

      “ \W ”匹配任何非单词字符。等价于“[^A-Za-z0-9_]”。

      iOS中书写正则表达式,碰到转义字符,多加一个“\”,例如:

      全数字字符:@”^\\d\+$”

     三、iOS中正则表达式

      1.正则表达式与NSPredicate连用,eg:

    - (BOOL)validateNumber:(NSString *) textString
    {
        NSString* number=@"^[0-9]+$";
        NSPredicate *numberPre = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",number];
        return [numberPre evaluateWithObject:textString];
    }

      2.NSString方法

      - (NSRange)rangeOfString:(NSString *)aString options:(NSStringCompareOptions)mask;

    NSString *searchText = @"rangeOfString";
    NSRange range = [searchText rangeOfString:@"^[0-9]+$" options:NSRegularExpressionSearch];
    if (range.location != NSNotFound) {
       NSLog(@"range :%@", [searchText substringWithRange:range]);
    }

      3.正则表达式类(NSRegularExpression)

    NSString *searchText = @"you want to match";    
    NSError *error = NULL;
    NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"^[0-9]+$" options:NSRegularExpressionCaseInsensitive error:&error];
    NSTextCheckingResult *result = [regex firstMatchInString:searchText options:0 range:NSMakeRange(0, [searchText length])];
    if (result) {
       NSLog(@"%@", [searchText substringWithRange:result.range]);
    }

     四、常用的正则表达式

      以下红色字符串是常用的正则表达式(以下正则表达式来自百度百科)

      1.验证用户名和密码:”^[a-zA-Z]\w{5,15}$”

      2.验证电话号码:(”^(\\d{3,4}-)\\d{7,8}$”)

      eg:021-68686868  0511-6868686;

      3.验证手机号码:”^1[3|4|5|7|8][0-9]\\d{8}$”;

      4.验证身份证号(15位或18位数字):”\\d{14}[[0-9],0-9xX]”;

      5.验证Email地址:(“^\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\.\\w+([-.]\\w+)*$”);

      6.只能输入由数字和26个英文字母组成的字符串:(“^[A-Za-z0-9]+$”) ;

      7.整数或者小数:^[0-9]+([.]{0,1}[0-9]+){0,1}$

      8.只能输入数字:”^[0-9]*$”。

      9.只能输入n位的数字:”^\\d{n}$”。

      10.只能输入至少n位的数字:”^\\d{n,}$”。

      11.只能输入m~n位的数字:”^\\d{m,n}$”。

      12.只能输入零和非零开头的数字:”^(0|[1-9][0-9]*)$”。

      13.只能输入有两位小数的正实数:”^[0-9]+(.[0-9]{2})?$”。

      14.只能输入有1~3位小数的正实数:”^[0-9]+(\.[0-9]{1,3})?$”。

      15.只能输入非零的正整数:”^\+?[1-9][0-9]*$”。

      16.只能输入非零的负整数:”^\-[1-9][]0-9″*$。

      17.只能输入长度为3的字符:”^.{3}$”。

      18.只能输入由26个英文字母组成的字符串:”^[A-Za-z]+$”。

      19.只能输入由26个大写英文字母组成的字符串:”^[A-Z]+$”。

      20.只能输入由26个小写英文字母组成的字符串:”^[a-z]+$”。

      21.验证是否含有^%&’,;=?$\”等字符:”[^%&',;=?$\x22]+”。

      22.只能输入汉字:”^[\u4e00-\u9fa5]{0,}$”。

      23.验证URL:”^http://([\\w-]+\.)+[\\w-]+(/[\\w-./?%&=]*)?$”。

      24.验证一年的12个月:”^(0?[1-9]|1[0-2])$”正确格式为:”01″~”09″和”10″~”12″。

      25.验证一个月的31天:”^((0?[1-9])|((1|2)[0-9])|30|31)$”正确格式为;”01″~”09″、”10″~”29″和“30”~“31”。

      26.获取日期正则表达式:\\d{4}[年|\-|\.]\\d{\1-\12}[月|\-|\.]\\d{\1-\31}日?

      评注:可用来匹配大多数年月日信息。

      27.匹配双字节字符(包括汉字在内):[^\x00-\xff]

      评注:可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)

      28.匹配空白行的正则表达式:\n\s*\r

      评注:可以用来删除空白行

      29.匹配HTML标记的正则表达式:<(\S*?)[^>]*>.*?</>|<.*? />

      评注:网上流传的版本太糟糕,上面这个也仅仅能匹配部分,对于复杂的嵌套标记依旧无能为力

      30.匹配首尾空白字符的正则表达式:^\s*|\s*$

      评注:可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式

      31.匹配网址URL的正则表达式:[a-zA-z]+://[^\s]*

      评注:网上流传的版本功能很有限,上面这个基本可以满足需求

      32.匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$

      评注:表单验证时很实用

      33.匹配腾讯QQ号:[1-9][0-9]\{4,\}

      评注:腾讯QQ号从10 000 开始

      34.匹配中国邮政编码:[1-9]\\d{5}(?!\d)

      评注:中国邮政编码为6位数字

      35.匹配ip地址:((2[0-4]\\d|25[0-5]|[01]?\\d\\d?)\.){3}(2[0-4]\\d|25[0-5]|[01]?\\d\\d?)。

      下面给出正则表达式的元字符(来自百度百科)

     五、正则表达式中的元字符

     

    元字符 描述
    \ 将下一个字符标记为一个特殊字符、或一个原义字符、或一个向后引用、或一个八进制转义符。例如,“\\n”匹配\n。“\n”匹配换行符。序列“\\”匹配“\”而“\(”则匹配“(”。
    ^ 匹配输入字符串的开始位置。如果设置了RegExp对象的Multiline属性,^也匹配“\n”或“\r”之后的位置。
    $ 匹配输入字符串的结束位置。如果设置了RegExp对象的Multiline属性,$也匹配“\n”或“\r”之前的位置。
    * 匹配前面的子表达式零次或多次(大于等于0次)。例如,zo*能匹配“z”,“zo”以及“zoo”。*等价于{0,}。
    + 匹配前面的子表达式一次或多次(大于等于1次)。例如,“zo+”能匹配“zo”以及“zoo”,但不能匹配“z”。+等价于{1,}。
    ? 匹配前面的子表达式零次或一次。例如,“do(es)?”可以匹配“do”或“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”。
    .点 匹配除“\r\n”之外的任何单个字符。要匹配包括“\r\n”在内的任何字符,请使用像“[\s\S]”的模式。
    (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”中的“plin”。
    [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-7),且m和l均为八进制数字(0-7),则匹配八进制转义值nml。
    \un 匹配n,其中n是一个用四个十六进制数字表示的Unicode字符。例如,\u00A9匹配版权符号(&copy;)。
    \< \> 匹配词(word)的开始(\<)和结束(\>)。例如正则表达式\<the\>能够匹配字符串”for the wise”中的”the”,但是不能匹配字符串”otherwise”中的”the”。注意:这个元字符不是所有的软件都支持的。
    \( \) 将 \( 和 \) 之间的表达式定义为“组”(group),并且将匹配这个表达式的字符保存到一个临时区域(一个正则表达式中最多可以保存9个),它们可以用 \1 到\9 的符号来引用。
    | 将两个匹配条件进行逻辑“或”(Or)运算。例如正则表达式(him|her) 匹配”it belongs to him”和”it belongs to her”,但是不能匹配”it belongs to them.”。注意:这个元字符不是所有的软件都支持的。
    + 匹配1或多个正好在它之前的那个字符。例如正则表达式9+匹配9、99、999等。注意:这个元字符不是所有的软件都支持的。
    ? 匹配0或1个正好在它之前的那个字符。注意:这个元字符不是所有的软件都支持的。
    {i} {i,j} 匹配指定数目的字符,这些字符是在它之前的表达式定义的。例如正则表达式A[0-9]{3} 能够匹配字符”A”后面跟着正好3个数字字符的串,例如A123、A348等,但是不匹配A1234。而正则表达式[0-9]{4,6} 匹配连续的任意4个、5个或者6个数字
    展开全文
  • 正则表达式语法详解

    2017-09-26 13:31:16
    正则表达式是一种文本模式,包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为“元字符”)。模式描述在搜索文本时要匹配的一个或多个字符串。 1.正则表达式基本语法 两个特殊的符号'^'和'$'。他们的作用...
    

    正则表达式是一种文本模式,包括普通字符(例如,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 οnkeyup="value=value.replace(/[\W]/g,'') " onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))" ID="Text1" NAME="Text1">

    2.只能输入数字的:

    <input οnkeyup="value=value.replace(/[^\d]/g,'') " onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))" ID="Text2" NAME="Text2">

    3.只能输入全角的:

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

    4.只能输入汉字的:

    <input οnkeyup="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到正无穷吧。

    *******************************************************************************

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    //校验纯中文字符
    /^[\u4E00-\u9FA5]+$/
    [\u4E00-\u9FA5] :估计是中文字符集的范围吧
    以上表达式均在下面的javascript中测试通过
    <html>
    <script language="JavaScript">
    <!--
    function regx(r,s)
    {
        if (r == null || r == ""){
           return false;
        }
        var patrn= new RegExp(r);
        if (patrn.exec(s))
           return true
        return false
    }
    -->
    </script>
    <body>
    <form>
        规则表达式 : <input type="input" name="regxStr" value="" > (填写/ /之间的表达式)
    <br>
        校验字符串 : <input type="input" name="str" value="" >
        <input type="button" name="match" value="匹配" onClick="alert(regx(regxStr.value,str.value));">
    </form>
    </body>
    </html>

    4.正則表達式應用

    "^\d+$"  //非负整数(正整数 + 0)
    "^[0-9]*[1-9][0-9]*$"  //正整数
    "^((-\d+)|(0+))$"  //非正整数(负整数 + 0)
    "^-[0-9]*[1-9][0-9]*$"  //负整数
    "^-?\d+$"    //整数
    "^\d+(\.\d+)?$"  //非负浮点数(正浮点数 + 0)
    "^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$"  //正浮点数
    "^((-\d+(\.\d+)?)|(0+(\.0+)?))$"  //非正浮点数(负浮点数 + 0)
    "^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$"  //负浮点数
    "^(-?\d+)(\.\d+)?$"  //浮点数
    "^[A-Za-z]+$"  //由26个英文字母组成的字符串
    "^[A-Z]+$"  //由26个英文字母的大写组成的字符串
    "^[a-z]+$"  //由26个英文字母的小写组成的字符串
    "^[A-Za-z0-9]+$"  //由数字和26个英文字母组成的字符串
    "^\w+$"  //由数字、26个英文字母或者下划线组成的字符串
    "^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$"    //email地址
    "^[a-zA-z]+://(\w+(-\w+)*)(\.(\w+(-\w+)*))*(\?\S*)?$"  //url
    /^(d{2}|d{4})-((0([1-9]{1}))|(1[1|2]))-(([0-2]([1-9]{1}))|(3[0|1]))$/   //  年-月-日
    /^((0([1-9]{1}))|(1[1|2]))/(([0-2]([1-9]{1}))|(3[0|1]))/(d{2}|d{4})$/   // 月/日/年
    "^([w-.]+)@(([[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.)|(([w-]+.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(]?)$"   //Emil
    "(d+-)?(d{4}-?d{7}|d{3}-?d{8}|^d{7,8})(-d+)?"     //电话号码
    "^(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5])$"   //IP地址

    ^([0-9A-F]{2})(-[0-9A-F]{2}){5}$   //MAC地址的正则表达式
    ^[-+]?\d+(\.\d+)?$  //值类型正则表达式

    5.javascript正则表达式检验

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    //校验是否全由数字组成
    function isDigit(s)
    {
    var patrn=/^[0-9]{1,20}$/;
    if (!patrn.exec(s)) return false
    return true
    }
    //校验登录名:只能输入5-20个以字母开头、可带数字、“_”、“.”的字串
    function isRegisterUserName(s)
    {
    var patrn=/^[a-zA-Z]{1}([a-zA-Z0-9]|[._]){4,19}$/;
    if (!patrn.exec(s)) return false
    return true
    }
    //校验用户姓名:只能输入1-30个以字母开头的字串
    function isTrueName(s)
    {
    var patrn=/^[a-zA-Z]{1,30}$/;
    if (!patrn.exec(s)) return false
    return true
    }
    //校验密码:只能输入6-20个字母、数字、下划线
    function isPasswd(s)
    {
    var patrn=/^(\w){6,20}$/;
    if (!patrn.exec(s)) return false
    return true
    }
    //校验普通电话、传真号码:可以“+”开头,除数字外,可含有“-”
    function isTel(s)
    {
    //var patrn=/^[+]{0,1}(\d){1,3}[ ]?([-]?(\d){1,12})+$/;
    var patrn=/^[+]{0,1}(\d){1,3}[ ]?([-]?((\d)|[ ]){1,12})+$/;
    if (!patrn.exec(s)) return false
    return true
    }
    //校验手机号码:必须以数字开头,除数字外,可含有“-”
    function isMobil(s)
    {
    var patrn=/^[+]{0,1}(\d){1,3}[ ]?([-]?((\d)|[ ]){1,12})+$/;
    if (!patrn.exec(s)) return false
    return true
    }
    //校验邮政编码
    function isPostalCode(s)
    {
    //var patrn=/^[a-zA-Z0-9]{3,12}$/;
    var patrn=/^[a-zA-Z0-9 ]{3,12}$/;
    if (!patrn.exec(s)) return false
    return true
    }
    //校验搜索关键字
    function isSearch(s)
    {
    var patrn=/^[^`~!@#$%^&*()+=|\\\][\]\{\}:;\'\,.<>/?]{1}[^`~!@$%^&()+=|\\\][\]\{\}:;\'\,.<>?]{0,19}$/;
    if (!patrn.exec(s)) return false
    return true
    }
    function isIP(s) //by zergling
    {
    var patrn=/^[0-9.]{1,20}$/;
    if (!patrn.exec(s)) return false
    return true
    }
    /*********************************************************************************
    * FUNCTION: isBetween
    * PARAMETERS: val AS any value
    * lo AS Lower limit to check
    * hi AS Higher limit to check
    * CALLS: NOTHING
    * RETURNS: TRUE if val is between lo and hi both inclusive, otherwise false.
    **********************************************************************************/
    function isBetween (val, lo, hi) {
    if ((val < lo) || (val > hi)) { return(false); }
    else { return(true); }
    }
    /*********************************************************************************
    * FUNCTION: isDate checks a valid date
    * PARAMETERS: theStr AS String
    * CALLS: isBetween, isInt
    * RETURNS: TRUE if theStr is a valid date otherwise false.
    **********************************************************************************/
    function isDate (theStr) {
    var the1st = theStr.indexOf('-');
    var the2nd = theStr.lastIndexOf('-');
    if (the1st == the2nd) { return(false); }
    else {
    var y = theStr.substring(0,the1st);
    var m = theStr.substring(the1st+1,the2nd);
    var d = theStr.substring(the2nd+1,theStr.length);
    var maxDays = 31;
    if (isInt(m)==false || isInt(d)==false || isInt(y)==false) {
    return(false); }
    else if (y.length < 4) { return(false); }
    else if (!isBetween (m, 1, 12)) { return(false); }
    else if (m==4 || m==6 || m==9 || m==11) maxDays = 30;
    else if (m==2) {
    if (y % 4 > 0) maxDays = 28;
    else if (y % 100 == 0 && y % 400 > 0) maxDays = 28;
    else maxDays = 29;
    }
    if (isBetween(d, 1, maxDays) == false) { return(false); }
    else { return(true); }
    }
    }
    /*********************************************************************************
    * FUNCTION: isEuDate checks a valid date in British format
    * PARAMETERS: theStr AS String
    * CALLS: isBetween, isInt
    * RETURNS: TRUE if theStr is a valid date otherwise false.
    **********************************************************************************/
    function isEuDate (theStr) {
    if (isBetween(theStr.length, 8, 10) == false) { return(false); }
    else {
    var the1st = theStr.indexOf('/');
    var the2nd = theStr.lastIndexOf('/');
    if (the1st == the2nd) { return(false); }
    else {
    var m = theStr.substring(the1st+1,the2nd);
    var d = theStr.substring(0,the1st);
    var y = theStr.substring(the2nd+1,theStr.length);
    var maxDays = 31;
    if (isInt(m)==false || isInt(d)==false || isInt(y)==false) {
    return(false); }
    else if (y.length < 4) { return(false); }
    else if (isBetween (m, 1, 12) == false) { return(false); }
    else if (m==4 || m==6 || m==9 || m==11) maxDays = 30;
    else if (m==2) {
    if (y % 4 > 0) maxDays = 28;
    else if (y % 100 == 0 && y % 400 > 0) maxDays = 28;
    else maxDays = 29;
    }
    if (isBetween(d, 1, maxDays) == false) { return(false); }
    else { return(true); }
    }
    }
    }
    /********************************************************************************
    * FUNCTION: Compare Date! Which is the latest!
    * PARAMETERS: lessDate,moreDate AS String
    * CALLS: isDate,isBetween
    * RETURNS: TRUE if lessDate<moreDate
    *********************************************************************************/
    function isComdate (lessDate , moreDate)
    {
    if (!isDate(lessDate)) { return(false);}
    if (!isDate(moreDate)) { return(false);}
    var less1st = lessDate.indexOf('-');
    var less2nd = lessDate.lastIndexOf('-');
    var more1st = moreDate.indexOf('-');
    var more2nd = moreDate.lastIndexOf('-');
    var lessy = lessDate.substring(0,less1st);
    var lessm = lessDate.substring(less1st+1,less2nd);
    var lessd = lessDate.substring(less2nd+1,lessDate.length);
    var morey = moreDate.substring(0,more1st);
    var morem = moreDate.substring(more1st+1,more2nd);
    var mored = moreDate.substring(more2nd+1,moreDate.length);
    var Date1 = new Date(lessy,lessm,lessd);
    var Date2 = new Date(morey,morem,mored);
    if (Date1>Date2) { return(false);}
    return(true);
    }
    /*********************************************************************************
    * FUNCTION isEmpty checks if the parameter is empty or null
    * PARAMETER str AS String
    **********************************************************************************/
    function isEmpty (str) {
    if ((str==null)||(str.length==0)) return true;
    else return(false);
    }
    /*********************************************************************************
    * FUNCTION: isInt
    * PARAMETER: theStr AS String
    * RETURNS: TRUE if the passed parameter is an integer, otherwise FALSE
    * CALLS: isDigit
    **********************************************************************************/
    function isInt (theStr) {
    var flag = true;
    if (isEmpty(theStr)) { flag=false; }
    else
    { for (var i=0; i<theStr.length; i++) {
    if (isDigit(theStr.substring(i,i+1)) == false) {
    flag = false; break;
    }
    }
    }
    return(flag);
    }
    /*********************************************************************************
    * FUNCTION: isReal
    * PARAMETER: heStr AS String
    decLen AS Integer (how many digits after period)
    * RETURNS: TRUE if theStr is a float, otherwise FALSE
    * CALLS: isInt
    **********************************************************************************/
    function isReal (theStr, decLen) {
    var dot1st = theStr.indexOf('.');
    var dot2nd = theStr.lastIndexOf('.');
    var OK = true;
    if (isEmpty(theStr)) return false;
    if (dot1st == -1) {
    if (!isInt(theStr)) return(false);
    else return(true);
    }
    else if (dot1st != dot2nd) return (false);
    else if (dot1st==0) return (false);
    else {
    var intPart = theStr.substring(0, dot1st);
    var decPart = theStr.substring(dot2nd+1);
    if (decPart.length > decLen) return(false);
    else if (!isInt(intPart) || !isInt(decPart)) return (false);
    else if (isEmpty(decPart)) return (false);
    else return(true);
    }
    }
    /*********************************************************************************
    * FUNCTION: isEmail
    * PARAMETER: String (Email Address)
    * RETURNS: TRUE if the String is a valid Email address
    * FALSE if the passed string is not a valid Email Address
    * EMAIL FORMAT: AnyName@EmailServer e.g; webmaster@hotmail.com
    * @ sign can appear only once in the email address.
    *********************************************************************************/
    function isEmail (theStr) {
    var atIndex = theStr.indexOf('@');
    var dotIndex = theStr.indexOf('.', atIndex);
    var flag = true;
    theSub = theStr.substring(0, dotIndex+1)
    if ((atIndex < 1)||(atIndex != theStr.lastIndexOf('@'))||(dotIndex < atIndex + 2)||(theStr.length <= theSub.length))
    { return(false); }
    else { return(true); }
    }
    /*********************************************************************************
    * FUNCTION: newWindow
    * PARAMETERS: doc -> Document to open in the new window
    hite -> Height of the new window
    wide -> Width of the new window
    bars -> 1-Scroll bars = YES 0-Scroll Bars = NO
    resize -> 1-Resizable = YES 0-Resizable = NO
    * CALLS: NONE
    * RETURNS: New window instance
    **********************************************************************************/
    function newWindow (doc, hite, wide, bars, resize) {
    var winNew="_blank";
    var opt="toolbar=0,location=0,directories=0,status=0,menubar=0,";
    opt+=("scrollbars="+bars+",");
    opt+=("resizable="+resize+",");
    opt+=("width="+wide+",");
    opt+=("height="+hite);
    winHandle=window.open(doc,winNew,opt);
    return;
    }
    /*********************************************************************************
    * FUNCTION: DecimalFormat
    * PARAMETERS: paramValue -> Field value
    * CALLS: NONE
    * RETURNS: Formated string
    **********************************************************************************/
    function DecimalFormat (paramValue) {
    var intPart = parseInt(paramValue);
    var decPart =parseFloat(paramValue) - intPart;
    str = "";
    if ((decPart == 0) || (decPart == null)) str += (intPart + ".00");
    else str += (intPart + decPart);
    return (str);
    }

    "^\\d+$"  //非负整数(正整数 + 0)
    "^[0-9]*[1-9][0-9]*$"  //正整数
    "^((-\\d+)|(0+))$"  //非正整数(负整数 + 0)
    "^-[0-9]*[1-9][0-9]*$"  //负整数
    "^-?\\d+$"    //整数
    "^\\d+(\\.\\d+)?$"  //非负浮点数(正浮点数 + 0)
    "^(([0-9]+\\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\\.[0-9]+)|([0-9]*[1-9][0-9]*))$"  //正浮点数
    "^((-\\d+(\\.\\d+)?)|(0+(\\.0+)?))$"  //非正浮点数(负浮点数 + 0)
    "^(-(([0-9]+\\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\\.[0-9]+)|([0-9]*[1-9][0-9]*)))$"  //负浮点数
    "^(-?\\d+)(\\.\\d+)?$"  //浮点数
    "^[A-Za-z]+$"  //由26个英文字母组成的字符串
    "^[A-Z]+$"  //由26个英文字母的大写组成的字符串
    "^[a-z]+$"  //由26个英文字母的小写组成的字符串
    "^[A-Za-z0-9]+$"  //由数字和26个英文字母组成的字符串
    "^\\w+$"  //由数字、26个英文字母或者下划线组成的字符串
    "^[\\w-]+(\\.[\\w-]+)*@[\\w-]+(\\.[\\w-]+)+$"    //email地址
    "^[a-zA-z]+://(\\w+(-\\w+)*)(\\.(\\w+(-\\w+)*))*(\\?\\S*)?$"  //url

    以上是本文的全部内容,希望大家喜欢。

    展开全文
  • 正则表达式知识详解系列,通过代码示例来说明正则表达式知识,建议自己按照例子手打一遍。 本示例的源代码下载地址: /** * 正则表达式基础 * @date 2016-04-15 10:23:56 * @author sgl */ public ...
  • JS的正则表达式的一些实例//校验是否全由数字组成。这个方法只是来验证数字的,并没有对是不是小数,或者以0开头的数字,后面还是不是0。等做判断。要求输入字符的个数为1-20。function isDigit(){var s=document....
  • Java 提供了功能强大的正则...  下面是一个简单的Java正则表达式例子,用于在文本中搜索 http://  String text =  "This is the text to be searched " +  "for occurrences of the http:// pattern.";  
  • 正则表达式知识详解系列,通过代码示例来说明正则表达式知识,建议自己按照例子手打一遍。 本示例的源代码下载地址:http://download.csdn.net/detail/gnail_oug/9504094 //提取td元素里的内容 String str=...
  • Java 正则表达式详解

    2019-10-08 19:04:49
    Java 提供了功能强大的正则表达式API,在java.util.regex 包下。本教程介绍如何使用正则表达式API。 正则表达式 ...下面是一个简单的Java正则表达式例子,用于在文本中搜索 http:// String tex...
  • java正则表达式详解

    2009-06-08 10:16:22
    正则表达式详解例子,很全 正则表达式详解例子,很全
  • 正则表达式(Regular expressions)是一套语法匹配规则,各种语言,如Perl, .Net和Java都有其对应的共享的正则表达式类库。在.Net中,这个类库叫做Regex。 简单的说,Regex是从字符窗中查找匹配字符串的应用类。通过...
  • https://www.cnblogs.com/chanshuyi/p/9197164.html 转载于:https://www.cnblogs.com/gaara-zhang/p/9687159.html
  • editplus正则表达式替换详解 (以下有被改动) 例子: 原始串 str[1]abc[991]; str[2]abc[992]; str[11]abc[993]; str[22]abc[994]; str[111]abc[995]; ...
  • 详解:[url]http://www.phpweblog.net/jarryyip/archive/2008/05/11/3363.html[/url] 使用例子: [url]...正则表达式在线测试工具: [url]http://www.zhongguosou.com/computer_question_t...
  • Java正则表达式详解

    2017-10-27 10:08:58
    Java 提供了功能强大的正则表达式API,在java.util.regex 包下。本教程介绍如何使用正则表达式API。...正则表达式示例下面是一个简单的Java正则表达式例子,用于在文本中搜索 http://String text = ...
  • JS的正则表达式的一些实例//校验是否全由数字组成。这个方法只是来验证数字的,并没有对是不是小数,或者以0开头的数字,后面还是不是0。等做
  • 今天来聊一聊他的正则表达式的使用规则,我会简单的举几个例子然后进行说明讲解,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

空空如也

空空如也

1 2 3 4 5 ... 15
收藏数 299
精华内容 119
关键字:

正则表达式例子详解