精华内容
下载资源
问答
  • 正则表达式匹配多个空格

    万次阅读 2016-08-31 18:07:17
    preg_match_all('/(.*?)[\s]*/ise',$body,$body_mat); 用[\s]*可匹配多个空格
     preg_match_all('/<div class=\"item\">(.*?)<\/p>[\s]*<\/div>/ise',$body,$body_mat);

    用[\s]*可匹配多个空格如</p>     </div>

    //去掉字符串中的空格

    $str1 = "我是中 国 " ;
    $s2 = preg_replace("/\s+/",'',$str1);
    $len =mb_strlen($s2,"UTF-8") ;


    展开全文
  • JavaScript正则匹配 多行内容

    千次阅读 2020-11-11 21:53:10
    需求: 通过正则匹配给定代码块中的链接和标题 刚开始是通过以下正则匹配的, 尝试之后匹配失败 let reg = /<a href="(.*?)" class="">.<span class="title">(.*?)<\/span><\/a>/igs 观察后...

    需求: 通过正则匹配给定代码块中的链接和标题

    刚开始是通过以下正则匹配的, 尝试之后匹配失败
    let reg = /<a href="(.*?)" class="">.<span class="title">(.*?)<\/span><\/a>/igs

    在这里插入图片描述

    观察后发现是由于代码之间的换行引起的, 虽然修正模式加上了s, 但是还是需要在每次换行的位置加上.*?进行匹配, 使用一下正则就可以匹配成功
    let reg = /<a href="(.*?)" class="">.*?<span class="title">(.*?)<\/span>.*?<\/a>/igs

    // 需要匹配的字符串
    let str = `
    <div>
    <a href="链接1" class="">
      <span class="title">名称1</span>
    </a>
    <a href="链接2" class="">
      <span class="title">名称2</span>
    </a>
    <a href="链接3" class="">
      <span class="title">名称3</span>
    </a>
    </div>
    `
    
    /**
     * 正则分析
     * 第一个(.*?) 匹配 电影链接
     * 第一个.*? 匹配代码换行之间可能产生的空格
     * 第二个(.*?) 匹配 电影标题
     * 第二个.*? 匹配代码换行之间可能产生的空格
     * igs i:不区分大小写 g:全局匹配 s:将字符串视为单行
    
     */
    let reg = /<a href="(.*?)" class="">.*?<span class="title">(.*?)<\/span>.*?<\/a>/igs
    
    let res
    // 保存信息的数组
    let movieArr = []
    
    // 循环匹配
    while (res = reg.exec(str)) {
      let obj = {
        name: res[2],
        url: res[1]
      }
      movieArr.push(obj)
    }
    
    console.log(movieArr)
    

    在这里插入图片描述

    展开全文
  • +: 一个或多个 ^: 开始,^\s,以空格开始 $: 结束,\s$,以空格结束 |:或者 /g:global, 全局 str.replace(/^\s+|\s+$/g,'') 错误写法如下: var reg=/(^\s+)gh(|\s)/g eg:str='hello chinagh' reg.test...

    1、项目需要匹配gh字符,要求gh前面有空格,后面有无空格都可以。

    思路如下:

    \s : 表示 space ,空格
    +: 一个或多个
    ^: 开始,^\s,以空格开始
    $: 结束,\s$,以空格结束
    |:或者
    /g:global, 全局

    str.replace(/^\s+|\s+$/g, '')

    错误写法如下:

       var reg=/(^\s+)gh(|\s)/g

    eg:str='hello china gh'

     reg.test(str)  //false

    正确的写法如下:

    reg=/( +)gh(l )/g

     reg.test(str)  //true

    错误分析:\s是匹配一个空白字符,包括空格、制表符、换页符和换行符。等价于[ \f\n\r\t\v\u00a0\u1680\u180e\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]。例如, /\s\w*/ 匹配"foo sdfsdfz."中的' sdfsdfz'。

    2、匹配.mp3:

    var regPls = /^\.mp3|\.mp3/g

    regPls.test('.mp3')
    匹配字符的位置以.mp3开头或者中间.mp3

    匹配位置的链接:https://www.jb51.net/article/159808.htm

    3、匹配1-3500(其他范围类推)

    var regs = /^([1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-3][0-4][0-9][0-9]|[1-3][0-5][0][0])$/g

    regs.test(3500); //true

    regs.test(3501); //false

    4、js中正则表达式中的特殊字符串如下:

    特殊符号意思
    \

    依照下列规则匹配:

    在非特殊字符之前的反斜杠表示下一个字符是特殊字符,不能按照字面理解。例如,前面没有 "\" 的 "b" 通常匹配小写字母 "b",即字符会被作为字面理解,无论它出现在哪里。但如果前面加了 "\",它将不再匹配任何字符,而是表示一个字符边界

    在特殊字符之前的反斜杠表示下一个字符不是特殊字符,应该按照字面理解。详情请参阅下文中的 "转义(Escaping)" 部分。

    如果你想将字符串传递给 RegExp 构造函数,不要忘记在字符串字面量中反斜杠是转义字符。所以为了在模式中添加一个反斜杠,你需要在字符串字面量中转义它。/[a-z]\s/i 和 new RegExp("[a-z]\\s", "i") 创建了相同的正则表达式:一个用于搜索后面紧跟着空白字符(\s 可看后文)并且在 a-z 范围内的任意字符的表达式。为了通过字符串字面量给 RegExp 构造函数创建包含反斜杠的表达式,你需要在字符串级别和表达式级别都对它进行转义。例如 /[a-z]:\\/i 和 new RegExp("[a-z]:\\\\","i") 会创建相同的表达式,即匹配类似 "C:\" 字符串。

    ^

    匹配输入的开始。如果多行标志被设置为 true,那么也匹配换行符后紧跟的位置。

    例如,/^A/ 并不会匹配 "an A" 中的 'A',但是会匹配 "An E" 中的 'A'。

    当 '^' 作为第一个字符出现在一个字符集合模式时,它将会有不同的含义。补充字符集合 一节有详细介绍和示例。

    $

    匹配输入的结束。如果多行标示被设置为 true,那么也匹配换行符前的位置。

    例如,/t$/ 并不会匹配 "eater" 中的 't',但是会匹配 "eat" 中的 't'。

    *

    匹配前一个表达式 0 次或多次。等价于 {0,}

    例如,/bo*/ 会匹配 "A ghost boooooed" 中的 'booooo' 和 "A bird warbled" 中的 'b',但是在 "A goat grunted" 中不会匹配任何内容。

    +

    匹配前面一个表达式 1 次或者多次。等价于 {1,}

    例如,/a+/ 会匹配 "candy" 中的 'a' 和 "caaaaaaandy" 中所有的 'a',但是在 "cndy" 中不会匹配任何内容。

    ?

    匹配前面一个表达式 0 次或者 1 次。等价于 {0,1}

    例如,/e?le?/ 匹配 "angel" 中的 'el'、"angle" 中的 'le' 以及 "oslo' 中的 'l'。

    如果紧跟在任何量词 *、 +、? 或 {} 的后面,将会使量词变为非贪婪(匹配尽量少的字符),和缺省使用的贪婪模式(匹配尽可能多的字符)正好相反。例如,对 "123abc" 使用 /\d+/ 将会匹配 "123",而使用 /\d+?/ 则只会匹配到 "1"。

    还用于先行断言中,如本表的 x(?=y) 和 x(?!y) 条目所述。

    .

    (小数点)默认匹配除换行符之外的任何单个字符。

    例如,/.n/ 将会匹配 "nay, an apple is on the tree" 中的 'an' 和 'on',但是不会匹配 'nay'。

    如果 s ("dotAll") 标志位被设为 true,它也会匹配换行符。

    (x)

    像下面的例子展示的那样,它会匹配 'x' 并且记住匹配项。其中括号被称为捕获括号

    模式 /(foo) (bar) \1 \2/ 中的 '(foo)' 和 '(bar)' 匹配并记住字符串 "foo bar foo bar" 中前两个单词。模式中的 \1 和 \2 表示第一个和第二个被捕获括号匹配的子字符串,即 foo 和 bar,匹配了原字符串中的后两个单词。注意 \1\2、...、\n 是用在正则表达式的匹配环节,详情可以参阅后文的 \n 条目。而在正则表达式的替换环节,则要使用像 $1$2、...、$n 这样的语法,例如,'bar foo'.replace(/(...) (...)/, '$2 $1')$& 表示整个用于匹配的原字符串。

    (?:x)

    匹配 'x' 但是不记住匹配项。这种括号叫作非捕获括号,使得你能够定义与正则表达式运算符一起使用的子表达式。看看这个例子 /(?:foo){1,2}/。如果表达式是 /foo{1,2}/{1,2} 将只应用于 'foo' 的最后一个字符 'o'。如果使用非捕获括号,则 {1,2} 会应用于整个 'foo' 单词。更多信息,可以参阅下文的 Using parentheses 条目.

    x(?=y)

    匹配'x'仅仅当'x'后面跟着'y'.这种叫做先行断言。

    例如,/Jack(?=Sprat)/会匹配到'Jack'仅仅当它后面跟着'Sprat'。/Jack(?=Sprat|Frost)/匹配‘Jack’仅仅当它后面跟着'Sprat'或者是‘Frost’。但是‘Sprat’和‘Frost’都不是匹配结果的一部分。

    (?<=y)x

    匹配'x'仅仅当'x'前面是'y'.这种叫做后行断言。

    例如,/(?<=Jack)Sprat/会匹配到' Sprat '仅仅当它前面是' Jack '。/(?<=Jack|Tom)Sprat/匹配‘ Sprat ’仅仅当它前面是'Jack'或者是‘Tom’。但是‘Jack’和‘Tom’都不是匹配结果的一部分。

    x(?!y)

    仅仅当'x'后面不跟着'y'时匹配'x',这被称为正向否定查找。

    例如,仅仅当这个数字后面没有跟小数点的时候,/\d+(?!\.)/ 匹配一个数字。正则表达式/\d+(?!\.)/.exec("3.141")匹配‘141’而不是‘3.141’

    (?<!y)x

    仅仅当'x'前面不是'y'时匹配'x',这被称为反向否定查找。

    例如, 仅仅当这个数字前面没有负号的时候,/(?<!-)\d+/ 匹配一个数字。
    /(?<!-)\d+/.exec('3') 匹配到 "3".
    /(?<!-)\d+/.exec('-3') 因为这个数字前有负号,所以没有匹配到。

    x|y

    匹配‘x’或者‘y’。

    例如,/green|red/匹配“green apple”中的‘green’和“red apple”中的‘red’

    {n}n 是一个正整数,匹配了前面一个字符刚好出现了 n 次。
    比如, /a{2}/ 不会匹配“candy”中的'a',但是会匹配“caandy”中所有的 a,以及“caaandy”中的前两个'a'。
    {n,}

    n是一个正整数,匹配前一个字符至少出现了n次。

    例如, /a{2,}/ 匹配 "aa", "aaaa" 和 "aaaaa" 但是不匹配 "a"。

    {n,m}

    n 和 m 都是整数。匹配前面的字符至少n次,最多m次。如果 n 或者 m 的值是0, 这个值被忽略。

    例如,/a{1, 3}/ 并不匹配“cndy”中的任意字符,匹配“candy”中的a,匹配“caandy”中的前两个a,也匹配“caaaaaaandy”中的前三个a。注意,当匹配”caaaaaaandy“时,匹配的值是“aaa”,即使原始的字符串中有更多的a。

    [xyz]一个字符集合。匹配方括号中的任意字符,包括转义序列。你可以使用破折号(-)来指定一个字符范围。对于点(.)和星号(*)这样的特殊符号在一个字符集中没有特殊的意义。他们不必进行转义,不过转义也是起作用的。
    例如,[abcd] 和[a-d]是一样的。他们都匹配"brisket"中的‘b’,也都匹配“city”中的‘c’。/[a-z.]+/ 和/[\w.]+/与字符串“test.i.ng”匹配。
    [^xyz]

    一个反向字符集。也就是说, 它匹配任何没有包含在方括号中的字符。你可以使用破折号(-)来指定一个字符范围。任何普通字符在这里都是起作用的。

    例如,[^abc] 和 [^a-c] 是一样的。他们匹配"brisket"中的‘r’,也匹配“chop”中的‘h’。

    [\b]

    匹配一个退格(U+0008)。(不要和\b混淆了。)

    \b

    匹配一个词的边界。一个词的边界就是一个词不被另外一个“字”字符跟随的位置或者前面跟其他“字”字符的位置,例如在字母和空格之间。注意,匹配中不包括匹配的字边界。换句话说,一个匹配的词的边界的内容的长度是0。(不要和[\b]混淆了)

    使用"moon"举例:
    /\bm/匹配“moon”中的‘m’;
    /oo\b/并不匹配"moon"中的'oo',因为'oo'被一个“字”字符'n'紧跟着。
    /oon\b/匹配"moon"中的'oon',因为'oon'是这个字符串的结束部分。这样他没有被一个“字”字符紧跟着。
    /\w\b\w/将不能匹配任何字符串,因为在一个单词中间的字符永远也不可能同时满足没有“字”字符跟随和有“字”字符跟随两种情况。

    注意: JavaScript的正则表达式引擎将特定的字符集定义为“字”字符。不在该集合中的任何字符都被认为是一个断词。这组字符相当有限:它只包括大写和小写的罗马字母,十进制数字和下划线字符。不幸的是,重要的字符,例如“é”或“ü”,被视为断词。

    \B

    匹配一个非单词边界。匹配如下几种情况:

    • 字符串第一个字符为非“字”字符
    • 字符串最后一个字符为非“字”字符
    • 两个单词字符之间
    • 两个非单词字符之间
    • 空字符串

    例如,/\B../匹配"noonday"中的'oo', 而/y\B../匹配"possibly yesterday"中的’yes‘

    \cX

    当X是处于A到Z之间的字符的时候,匹配字符串中的一个控制符。

    例如,/\cM/ 匹配字符串中的 control-M (U+000D)。

    \d

    匹配一个数字等价于[0-9]

    例如, /\d/ 或者 /[0-9]/ 匹配"B2 is the suite number."中的'2'。

    \D

    匹配一个非数字字符等价于[^0-9]

    例如, /\D/ 或者 /[^0-9]/ 匹配"B2 is the suite number."中的'B' 。

    \f匹配一个换页符 (U+000C)。
    \n匹配一个换行符 (U+000A)。
    \r匹配一个回车符 (U+000D)。
    \s

    匹配一个空白字符,包括空格、制表符、换页符和换行符。等价于[ \f\n\r\t\v\u00a0\u1680\u180e\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]。

    例如, /\s\w*/ 匹配"foo bar."中的' bar'。

    \S

    匹配一个非空白字符。等价于 [^ \f\n\r\t\v\u00a0\u1680\u180e\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]

    例如,/\S\w*/ 匹配"foo bar."中的'foo'。

    \t匹配一个水平制表符 (U+0009)。
    \v匹配一个垂直制表符 (U+000B)。
    \w

    匹配一个单字字符(字母、数字或者下划线)。等价于 [A-Za-z0-9_]

    例如, /\w/ 匹配 "apple," 中的 'a',"$5.28,"中的 '5' 和 "3D." 中的 '3'。

    \W

    匹配一个非单字字符。等价于 [^A-Za-z0-9_]

    例如, /\W/ 或者 /[^A-Za-z0-9_]/ 匹配 "50%." 中的 '%'。

    \n

    在正则表达式中,它返回最后的第n个子捕获匹配的子字符串(捕获的数目以左括号计数)。

    比如 /apple(,)\sorange\1/ 匹配"apple, orange, cherry, peach."中的'apple, orange,' 。

    \0匹配 NULL(U+0000)字符, 不要在这后面跟其它小数,因为 \0<digits> 是一个八进制转义序列。
    \xhh与代码 hh 匹配字符(两个十六进制数字)
    \uhhhh与代码 hhhh 匹配字符(四个十六进制数字)。
    \u{hhhh}(仅当设置了u标志时)使用 Unicode 值 hhhh 匹配字符(十六进制数字)。

    1、正则的分组,捕获可参考https://www.cnblogs.com/zhaoshujie/p/10103315.html文章

    2、分组捕获的例子可参考:https://www.jb51.net/article/160517.htm

    3、正则表达式概念及repalce可参考https://www.cnblogs.com/xiyunfang/articles/7760158.html

    4、下面的常用的正则表达式参考于正则表达式在线测试 | 菜鸟工具 (runoob.com)

    ---------------------------------------常用的正则表达式如下---------------------------------------------------------

    校验数字的表达式

    • 数字:^[0-9]*$
    • n位的数字:^\d{n}$
    • 至少n位的数字:^\d{n,}$
    • m-n位的数字:^\d{m,n}$
    • 零和非零开头的数字:^(0|[1-9][0-9]*)$
    • 非零开头的最多带两位小数的数字:^([1-9][0-9]*)+(\.[0-9]{1,2})?$
    • 带1-2位小数的正数或负数:^(\-)?\d+(\.\d{1,2})$
    • 正数、负数、和小数:^(\-|\+)?\d+(\.\d+)?$
    • 有两位小数的正实数:^[0-9]+(\.[0-9]{2})?$
    • 有1~3位小数的正实数:^[0-9]+(\.[0-9]{1,3})?$
    • 非零的正整数:^[1-9]\d*$ 或 ^([1-9][0-9]*){1,3}$ 或 ^\+?[1-9][0-9]*$
    • 非零的负整数:^\-[1-9][]0-9"*$ 或 ^-[1-9]\d*$
    • 非负整数:^\d+$ 或 ^[1-9]\d*|0$
    • 非正整数:^-[1-9]\d*|0$ 或 ^((-\d+)|(0+))$
    • 非负浮点数:^\d+(\.\d+)?$ 或 ^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$
    • 非正浮点数:^((-\d+(\.\d+)?)|(0+(\.0+)?))$ 或 ^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0+|0$
    • 正浮点数:^[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]*))$
    • 负浮点数:^-([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]*)))$
    • 浮点数:^(-?\d+)(\.\d+)?$ 或 ^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$

    校验字符的表达式

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

    特殊需求表达式

    • Email地址:^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$
    • 域名:[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+\.?
    • InternetURL:[a-zA-z]+://[^\s]* 或 ^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$
    • 手机号码:^(13[0-9]|14[5|7]|15[0|1|2|3|4|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$
    • 电话号码("XXX-XXXXXXX"、"XXXX-XXXXXXXX"、"XXX-XXXXXXX"、"XXX-XXXXXXXX"、"XXXXXXX"和"XXXXXXXX):^(\(\d{3,4}-)|\d{3.4}-)?\d{7,8}$
    • 国内电话号码(0511-4405222、021-87888822):\d{3}-\d{8}|\d{4}-\d{7}
    • 电话号码正则表达式(支持手机号码,3-4位区号,7-8位直播号码,1-4位分机号): ((\d{11})|^((\d{7,8})|(\d{4}|\d{3})-(\d{7,8})|(\d{4}|\d{3})-(\d{7,8})-(\d{4}|\d{3}|\d{2}|\d{1})|(\d{7,8})-(\d{4}|\d{3}|\d{2}|\d{1}))$)
    • 身份证号(15位、18位数字),最后一位是校验位,可能为数字或字符X:(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)
    • 帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$
    • 密码(以字母开头,长度在6~18之间,只能包含字母、数字和下划线):^[a-zA-Z]\w{5,17}$
    • 强密码(必须包含大小写字母和数字的组合,不能使用特殊字符,长度在 8-10 之间):^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])[a-zA-Z0-9]{8,10}$
    • 强密码(必须包含大小写字母和数字的组合,可以使用特殊字符,长度在8-10之间):^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$
    • 日期格式:^\d{4}-\d{1,2}-\d{1,2}
    • 一年的12个月(01~09和1~12):^(0?[1-9]|1[0-2])$
    • 一个月的31天(01~09和1~31):^((0?[1-9])|((1|2)[0-9])|30|31)$
    • 钱的输入格式:
      1. 有四种钱的表示形式我们可以接受:"10000.00" 和 "10,000.00", 和没有 "分" 的 "10000" 和 "10,000":^[1-9][0-9]*$
      2. 这表示任意一个不以0开头的数字,但是,这也意味着一个字符"0"不通过,所以我们采用下面的形式:^(0|[1-9][0-9]*)$
      3. 一个0或者一个不以0开头的数字.我们还可以允许开头有一个负号:^(0|-?[1-9][0-9]*)$
      4. 这表示一个0或者一个可能为负的开头不为0的数字.让用户以0开头好了.把负号的也去掉,因为钱总不能是负的吧。下面我们要加的是说明可能的小数部分:^[0-9]+(.[0-9]+)?$
      5. 必须说明的是,小数点后面至少应该有1位数,所以"10."是不通过的,但是 "10" 和 "10.2" 是通过的:^[0-9]+(.[0-9]{2})?$
      6. 这样我们规定小数点后面必须有两位,如果你认为太苛刻了,可以这样:^[0-9]+(.[0-9]{1,2})?$
      7. 这样就允许用户只写一位小数.下面我们该考虑数字中的逗号了,我们可以这样:^[0-9]{1,3}(,[0-9]{3})*(.[0-9]{1,2})?$
      8. 1到3个数字,后面跟着任意个 逗号+3个数字,逗号成为可选,而不是必须:^([0-9]+|[0-9]{1,3}(,[0-9]{3})*)(.[0-9]{1,2})?$
      9. 备注:这就是最终结果了,别忘了"+"可以用"*"替代如果你觉得空字符串也可以接受的话(奇怪,为什么?)最后,别忘了在用函数时去掉去掉那个反斜杠,一般的错误都在这里
    • xml文件:^([a-zA-Z]+-?)+[a-zA-Z0-9]+\\.[x|X][m|M][l|L]$
    • 中文字符的正则表达式:[\u4e00-\u9fa5]
    • 双字节字符:[^\x00-\xff] (包括汉字在内,可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1))
    • 空白行的正则表达式:\n\s*\r (可以用来删除空白行)
    • HTML标记的正则表达式:<(\S*?)[^>]*>.*?|<.*? /> ( 首尾空白字符的正则表达式:^\s*|\s*$或(^\s*)|(\s*$) (可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式)
    • 腾讯QQ号:[1-9][0-9]{4,} (腾讯QQ号从10000开始)
    • 中国邮政编码:[1-9]\d{5}(?!\d) (中国邮政编码为6位数字)
    • IPv4地址:((2(5[0-5]|[0-4]\d))|[0-1]?\d{1,2})(\.((2(5[0-5]|[0-4]\d))|[0-1]?\d{1,2})){3}

    展开全文
  • JavaScript 正则匹配中英文姓名

    千次阅读 2019-12-07 17:09:15
    工作中突然想给姓名输入框加入正则匹配的验证,以防止用户输入的姓名比网络昵称还奇葩,结果还真费了不少功夫。 首先我们确认规则: ①中英文文字不能混杂 ②汉字不能夹杂任何特殊字符和空格(如果要兼容少数民族...

    工作中突然想给姓名输入框加入正则匹配的验证,以防止用户输入的姓名比网络昵称还奇葩,结果还真费了不少功夫。

    首先我们确认规则:

    ①中英文文字不能混杂

    ②汉字不能夹杂任何特殊字符和空格(如果要兼容少数民族的姓名的话可以参考英文的匹配写法)

    ③英文只能夹杂空格,且不能在开头结尾

    中文的名称规范很简单:

    let reg = /^[\u4e00-\u9fa5]+$/;

    英文的名称规范就相对复杂了,因为空格不能在开头结尾,且不能连续。所以我们可以换个角度思考:

    英文名称就是一个存储着多个纯字母字符串的数组,然后用空格连起来。因此,除最后一段字母以外,其他所有字母串都默认紧随一个空格,最后必须以字母结尾。因此思路为:

    ①匹配多个字母,并以空格结尾,匹配0次或多次

    ②结尾匹配多个字母

    代码如下:

    let reg = /^([a-zA-Z]+\s)*[a-zA-Z]+$/;

    当然,我们也可以要求用户的姓名必须以大写字母开头:

    let reg = /^(\b[A-Z][a-z]*\s)*\b[A-Z][a-z]*$/;

    考虑到本人作为一名中国人,对老外的起名习惯不太了解,所以“限制大写开头”的规则并没有实际使用,还是使用了比较稳妥的“不限制大小写”的版本,没准用户也是个痴迷驼峰命名法的程序员呢(笑)。

    综合两个正则规则,我们的用户姓名限制条件写为:

    let reg = /(^([a-zA-Z]+\s)*[a-zA-Z]+$)|(^[\u4e00-\u9fa5]+$)/;

     另:这里标记我发现的一个坑。

    我曾设想英文的匹配规则如下:

    “匹配多个字母串,以字母开头,结尾的空格可有可无,整个字符串最后必须是一个字母。”

    写法如下:

    let reg = /(^([a-zA-Z]+\s?)*[a-zA-Z]$)/; // 存在缺陷,请勿使用

    进行测试:

    console.log(reg.test('Ahsflu Aaif Adfssafea'));
    // true

    测试结果证明,该匹配规则可以验证英文姓名。 

    那么问题来了,缺陷在哪里呢?我当时自信地以为找到了不错的匹配规则,但是进行进一步测试的时候发现,这个正则匹配偶尔会卡住!

    我们来测试一下:

    let reg = /(^([a-zA-Z]+\s?)*[a-zA-Z]$)/;
    console.time('time');
    console.log(reg.test('Ahsflu Aaif Adfssafea'));
    console.timeEnd('time');
    console.time('time');
    console.log(reg.test('Ahsflu Aaif Adfssadsaffea'));
    console.timeEnd('time');
    console.time('time');
    console.log(reg.test('Ahsflu Aaif Adfssadsdsfaaffea'));
    console.timeEnd('time');
    console.time('time');
    console.log(reg.test('Ahsflu Aaif Adfsaffea '));
    console.timeEnd('time');
    console.time('time');
    console.log(reg.test('Ahsflu Aaif Adfsadsfsdafasdffea '));
    console.timeEnd('time');

    显示结果如下:

    true
    time: 8.811ms
    true
    time: 0.694ms
    true
    time: 0.707ms
    false
    time: 1.921ms
    false
    time: 1192.601ms

    注意到了吗?当测试的字符串结尾有空格的时候,整个正则匹配需要的时间随着字符串长度增加而呈现爆炸式增长。很明显这与正则表达式中的'\s?'这个表示可有可无的空格有关。

    我的猜测是:由于正则匹配默认采用“贪心”模式,当结尾为空格时,正则匹配根据第一项' ([a-zA-Z]+\s?)* '可以正确的匹配到结尾,但是却发现下一项' [a-zA-Z] '匹配失败了,由于第一项最后的*(匹配1至多个)原则,匹配存在多种可能,程序尚不能判定结果为true还是false,所以必须推倒重来,进行多次尝试。在程序尝试完所有可能的情况之后,程序终于判定字符串不合法,才输出false。

    实际情况是:只要我们删掉'\s?'中的'?'指令,这个bug就不复存在了。

    这件事情告诉我们在正则匹配中要谨慎使用'?',正如它的含义“可有可无”一样,被'?'形容的规则可以存在于范围内任何可能的地方,这对于死板的程序来说无疑是一个噩梦。

    另外,连续使用console.time()方法统计时间的时候,第一项往往会需要更长的时间(分配内存什么的),console.time()统计的时间包括自身。所以即便是统计一个空的语句段,第一次console.time()方法也会比后续方法多出几倍甚至几十倍的时间。

    展开全文
  • js正则匹配去除输入框的前后空格 // * 表示: 零个 或多个字符 也可以用 + , 一个或多个 去除开头空格: str =str.replace(/^\s*/ , ""); 去除结尾空格: str = str.replace(/\s*$/ , "") 去除前后空格: str = ...
  • Pattern p = Pattern.compile("\\s{2,}|\t"); Matcher m = p.matcher(str); String strNoBlank = m.replaceAll(" "); System.out.println(strNoBlank);
  • let str = `<div> <... 测试正则匹配替换 </p> <br/> <p class=""> <style>.icon{width:100%;}</style> 测试正则匹配替换 </p> </d.
  • javascript正则匹配重复出现的字符

    千次阅读 2018-12-17 20:20:38
    正则可以帮我们做很事情,正则表达式不局限于任何一门语言,应该说是编程语言里的一通用的语言或者语法,不同语言之间的正则稍微有些差别,但是语法基本类似,比如\w在js中表示的是任意单词字符,但是在java中就...
  • 给定一像这样的字符串: "The dog has a long tail, and it is RED!" 什么样的jQuery或JavaScript魔术可以用来将空
  • 网上查阅的大部分JavaScript中文/中文符号/空格正则匹配,在中文加一英文或者数字都能校验通过,无法满足实际的校验需求,使用下面的字符串替换方法,并比对str替换前后的length,即可完成准确的实际校验需求 ...
  • 常用JS正则匹配函数

    万次阅读 2011-05-26 20:05:00
    //校验用户名:只能输入1-30字母 function isTrueName(s) { var patrn=/^[a-zA-Z]{1,30}$/; if (!patrn.exec(s)) return false return true } //校验密码:只能输入6-20字母、数字、下划线 ...
  • Js正则匹配标签内容

    2013-12-18 12:33:45
    要求用正则 把 每个 span标签里面的内容前面的 多个空格 替换掉 一个空格,如下,2前面的空格不变。 <span style="color: #0;"> 1</span> <span style="color: #0;"> 1 2</span> 谢谢!
  • 1. 平时做网站经常要用正则表达式,下面是一些讲解和例子,仅供大家参考和修改使用:  2. "^\d+$" //非负整数(正整数 + 0)  3. "^[0-9]*[1-9][0-9]*$" //正整数  4. "^((-\d+)|(0+))$" //非正整数(负...
  • 主要介绍了javascript将字符串中的多个空格替换为一个空格的正则实例,需要的朋友可以参考下
  • 正则匹配换行

    千次阅读 2018-04-17 19:26:00
    使用 FTP 上传文件到服务器之后,每个文件内容都多了一个换行,此程序将多个换行替换成一个换行 使用前先测试。 header("Content-type: text/html; charset=utf-8"); /** * 读取目录下的文件 * @author Xm * ...
  • 正则匹配

    2017-10-11 14:53:00
    此外,JavaScript这种客户端的脚本语言也提供了对正则表达式的支持,现在正则表达式已经成为了一通用的概念和工具,被各类技术人员所广泛使用。 在某个Linux网站上面有这样的话:"如果你问一下L...
  • var reg = /^(\s*\d{11}\s*){2,}$/; document.getElementById('btn').onclick = function() { var val = document.getElementById('inputtext').value; alert(reg.test(val)); };
  • javascript中的正则匹配学习

    千次阅读 2016-11-24 19:02:59
    深入浅出的javascript正则表达式:http://www.cnblogs.com/tugenhua0707/p/5037811.html#_labe1
  • 正则匹配字符之间的字符串

    万次阅读 2018-09-05 10:38:19
    ”表示匹配0个或多个)  示例: Xabab 结果: XababcdcY匹配两个字符串A与B中间的字符串包含A但是不包含B:  表达式: X.*?(?=Y)  示例: XabadY 结果: Xabad匹配两个字符串X与Y中间的字符串且不包含X与Y:  表达式:...
  • Nginx 路径匹配规则 ...~ 正则匹配(区分大小写) ~* 正则匹配(不区分大小写) !~ 区分大小写不匹配 !~* 不区分大小写不匹配 / 任何请求都会匹配 location [=|~|~*|^~] /uri/ { } 符号优先级 首先匹配 =,其次匹配^~,
  • 这是阅读《JavaScript正则表达式迷你书》后整理的一些笔记。 正则表达式是匹配模式,可以匹配字符,可以匹配位置。 下面主要介绍匹配字符的情况,匹配位置的情况我也正在学习中。 两种模糊匹配: 1.横向模糊匹配:一...
  • 14. Perl 正则表达式-正则匹配

    千次阅读 2019-08-27 16:04:41
    1. 正则匹配语法 Perl 的正则表达式语法非常灵活, 可以借助于内置变量$_ 进行简化, 也可以借助于m符号来自定义匹配定界符. 1.1 简写方式 简写模式使用内置变量$_与模式进行匹配. 标准模式无须...
  • str.replace(/^\s+|\s+$...\s :表示space,空格+: 一个或多个^: 开始,^\s,以空格开始$: 结束,\s$,以空格结束|:或者/g:global, 全局replace() 替换 转载于:https://www.cnblogs.com/zhn0823/p/5890686....
  • javascript 正则表达式 去除空格

    千次阅读 2010-11-02 10:39:00
     去除字符串两端空格的处理  如果采用传统的方式,就要可能就要采用下面的方式了  //清除左边空格  function js_ltrim(deststr)  {  if(deststr==null)return "";  var ...
  • var str="是吗@Test1:我觉得你说的很对@Test:学无止境"; var r=str.match(/@.*?:/ig); for (var index = 0; index < r.length; index++) { str=str.replace(r[index],"<a>"+...
  • +: 一个或多个 ^: 开始,^\s,以空格开始 $: 结束,\s$,以空格结束 |:或者 /g:global, 全局 replace() 替换 转载于:https://my.oschina.net/yangq20/blog/1488495
  • JS 提取字符串的手机号或者邮箱,正则匹配 function handlerStr(str) { let newStr = null;//返回值 const phoneReg = /(1[0-9]{2,10})|([0-9]{3,4})?[0-9]{7,8}|[\d\w]+\b@[a-zA-ZA-z0-9]+.[a-z]+/g;//匹配手机号...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 36,052
精华内容 14,420
关键字:

js正则匹配多个空格