探索正则表达式的神奇魅力

正则表达式

正则表达式,如同一位技艺精湛的艺术家,能够以极致的精准和优雅,雕刻出你想要的文本形态。它的魅力在于其简练而灵活的语法,让你得以轻松地在庞杂的文字丛林中捕捉目标。

无论是验证数据格式的合法性、从复杂文本中提取关键信息,抑或是进行批量替换操作,正则表达式都能为你实现心中所想。它不受语言或平台的限制,几乎涵盖了所有主流的编程语言和文本编辑器,因此成为了文本处理领域的无可替代之选。

尽管学习曲线可能稍显陡峭,但一旦掌握,正则表达式将成为你的得力助手,为你带来高效、精确的文本处理体验。它让你能够以巧妙的方式应对各种文本处理挑战,将混沌的文本数据塑造成你想要的形态,展现出处理文本的艺术之美。

创建方式:

  1. 字面量:
    1. 使用斜杠(/)包围创建正则
    2. 例:/abc/
    3. 优点:性能好,当正则保持不变时
  2. 构造函数:
    1. 调用RegExp对象的构造函数
    2. 例:new RegExp("abc")
    3. 优点:可以动态的定义,比如根据用户输入的不同的信息,创建指定的正则

正则规则:

  1. /abc/:匹配字符串中包含abc

  2. /ab*c/:*表示前一项出现零次或者多次,可以是字符串 abbbbc 或者 abc 或者 ac

  3. 断言:

    1. 边界类断言:

      1. ^:匹配开头

      2. $:匹配结束

      3. [\b]:匹配一个退格(U+0008)。(和\b不同)

      4. \b:匹配边界:

        比如:/\bw/ 在 "want" 中匹配到 w,并且 w 只能在边
        比如:/t\b/ 在 "want" 中匹配到 t,并且 t 只能在边
        
      5. \B:匹配边界

        比如:/w\B/ 在 "want" 中匹配到 w,并且 w 只能在前边
        比如:/\Bt/ 在 "want" 中匹配到 t,并且 t 只能在后边
        
    2. 其他断言:

      1. x(?=y)先行断言x 后面跟随着 y 时匹配结果为 x

        例如:/\d(?=\.)/.exec(55.47) 匹配 55
        
      2. x(x?!y)先行否定断言: x 后面没有跟随 y 时匹配结果为 x

        例如:/\d+(?!\.)/.exec(55.47) 匹配 47
        
      3. (?<=y)x后行断言: x 前面跟随着 y时匹配结果为 x

        例如:/(?<=\.)\d+/.exec(55.47) 匹配 47
        
      4. (?<!y)x后行否定断言: x 前面没有跟随着 y 时匹配结果为 x

        例如:/(?<!\.)\d+/.exec(55.47) 匹配 55
        
  4. 字符类:

    1. [xyz] | [a-c]:匹配方括号中的任何字符,如果连字符可以使用-连接,比如[abcd] === [a-d]

    2. [^xyz] | [^a-c]:匹配除方括号中字符的任何字符,例:[^abc]匹配"bcaqh"中的q(^也可以表示输入的开始)

    3. .:匹配除行终止符之外的任何单个字符:\n\r\u2028\u2029

      例如:/.y/ 在"yes make my day"中匹配 my 和 ay,而不是 yes
      
    4. \d:等同于[0-9],匹配任何数字, /\d/ === /[0-9]/

    5. \D:等同于[^0-9],匹配任何非数字的字符

    6. \w:等同于[A-Za-z0-9_],匹配基本拉丁字母中的任何字母数字字符

    7. \W:等同于[^A-Za-z0-9_],匹配除基本拉丁字母中的任何字母数字字符的字符,例:%,&

    8. \s:匹配单个空白字符。\f \n \r \t \v ……,例:/\s\w*/匹配"say hi"中的"hi"

    9. \S,匹配一个非空白字符

    10. \t:水平制表符

    11. \r:回车符

    12. \n:换行符

    13. \v:垂直制表符

    14. \f:换页符

    15. \:转义后面的字符

      比如匹配 *,需要在 * 前加 \ => /\a\*/ 匹配到 "a*"
      比如匹配 \,需要/\\/,使用前一个 \ 转义后一个 \ 来匹配后一个 \
      
    16. a|b:匹配ab,管道符(|)分隔部分表示可选项,[ab]也可以匹配方括号内任何字符

  5. 量词:

    1. x* | x{0,}:表示前一项 x 出现 0 次或者多次
    2. x+ | x{1,}:表示前一项 x 出现 1 次或者多次
    3. x? | x{0,1}:表示前一项 x 出现 0 次或者 1 次
    4. x{n}:表示前一项 x 匹配 n
    5. x{n,}:表示前一项 x 至少匹配 n 次,至多不限
    6. x{n,m}:表示前一项 x 至少匹配 n 次,至多匹配 m
  6. 标志:

    1. g:全局搜索:不止搜索出第一个符合条件的项,会将所有符合条件的都搜索到
    2. i:不区分大小写
    3. m:多行搜索
    4. s:允许.匹配换行符
    5. u:使用unicode码的模式进行匹配
    6. y:执行”粘性(sticky)搜索,匹配从目标字符串的当前位置开始“
    7. 例如:不区分大小写
      1. 字面量:/d*/i
      2. 构造函数:new RegExp("d*", "i")

正则方法:

使用范围:

  1. RegExp
    1. exec:一个在字符串中执行查找匹配的 RegExp 方法,它返回一个数组(未匹配到则返回 null
    2. test:一个在字符串中测试是否匹配的 RegExp 方法,它返回 truefalse
  2. String
    1. match:一个在字符串中执行查找匹配的 String 方法,它返回一个数组,在未匹配到时会返回 null
    2. matchAll:一个在字符串中执行查找所有匹配的 String 方法,它返回一个迭代器(iterator
    3. replace:一个在字符串中执行查找匹配的 String 方法,并且使用替换字符串替换掉匹配到的子字符串。
    4. search:一个在字符串中测试匹配的 String 方法,它返回匹配到的位置索引,或者在失败时返回 -1
    5. split:一个使用正则表达式或者一个固定字符串分隔一个字符串,并将分隔后的子字符串存储到数组中的 String 方法

混淆点:

  1. /a\+b/ === new RegExp("a\\+b")

    因为在字符串中,一个\代表转义字符,所以在字符串中:

    1. 使用"a\+b"的话,其实就是将普通的*进行了转义,所以new RegExp("a\+b") === /a+b/
    2. 使用"a\\+b"的话,就是将普通的+转义为特殊字符后,再转义为普通字符,所以new RegExp("a\\+b") === /a\+b/
  2. new RegExp("a\+b") === new RegExp("a+b") === /a+b/

    因为在JavaScript字符串中,反斜线\作为转义字符,所以在字符串中使用反斜杠会影响字符串的解释,例如:\n换行符,\t制表符等

    1. 使用"a\+b"的话,\+会被解释为一个普通的+
    2. 使用"a+b",输出同样是"a+b"
    console.log("a\+b") // 输出:a+b
    console.log("a+b")  // 输出:a+b
    

    所以实际上输出都是a+b。因此,将这样的字符串传递给 new RegExp() 构造函数时,都会生成 /a+b/ 的正则。

在文字的编织中,正则表达式是你的神奇魔杖。让我们一起握紧这把魔杖,探索文本世界的奥秘,创造出更美好的故事!

  • 9
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值