zoukankan      html  css  js  c++  java
  • 正则表达式分组小记

    说是小记,主要是怕忘记了。

    一个正则语法-命名分组

    正则分组依赖圆括号,每个括号内的表达式是一个分组,为了避免,在一个完整的表达式中出现多个分组,依靠组序号获取组匹配项时的混乱,使用命名分组是很好地方法。

    在.Net中语法为  (?<name>pattern)  其中尖括号(<>)可以使用单引号('')替换。

    在Python中语法基本一致,只是在组名称前多了一个大写字母P  (?P<name>pattern)   不可以使用单引号替换尖括号。

    以Python为例,如图

    第一个表达式'a.*b'没有进行分组,那么匹配结果只有一个,所以只可以使用m.group(0),否则会报索引错误。

    第二个表达式'(a.*b)'有分组,匹配结果和第一个一样,但是,它可以使用m.group(0)和m.group(1)。

    原因是匹配结果中,m.group(0)是整个正则表达式的匹配结果,分组匹配结果从索引1开始。

    所以,当有众多的分组时,获取某一分组的匹配项会很容易造成混乱。

    使用命名分组

    比如匹配这个字符串“1978年  sex:male ”

    使用命名分组

      .Net(尖括号、引号都可以)  (?'year'd{4}).*?sex:(?<gender>.*)

      Python   (?P<year>d{4}).*?sex:(?P<gender>.*)

    Python结果如下

    此时既可以使用索引方式获取分组匹配项,当然更推荐的方式是使用分组命名获取对象匹配项,这样无论正则表达式多少个分组,均不需要考虑分组的索引,只要通过名称就可以获取到了。

    另外一提

    (?P<year>d{4}).*?sex:(?P<gender>.*)

    表达式中标红的意思是:(.)任意字符-(*)0个或多个-(?)最短匹配

    就是说如果要匹配的字符串中有多个'sex'子串,该表达式会匹配到最先(最短)出现的那个'sex'

    看到一篇非捕获组的博客,简单易懂,详细点击这里

  • 相关阅读:
    队列(顺序存储结构)
    2015计划
    iframe子窗口父窗口方法调用和元素获取
    Ajax关于重定向
    Java国际化资源文件的选择
    eclipse自动部署web应用程序到tomcat webapps
    从给定字符串结尾获取指定字节长度的字符串
    Winform的一些不知道啥东西
    C# 2008核心编程 2013-09-14
    C# 2008核心编程 2013-09-10
  • 原文地址:https://www.cnblogs.com/cotton/p/3795059.html
Copyright © 2011-2022 走看看