• 正则表达式分组小记


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

    一个正则语法-命名分组

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

    在.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'

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

  • 相关阅读:
    [翻译] DZNSegmentedControl
    GONMarkupParser的使用
    使用@selector模仿代理功能降低代码耦合度
    编译并导入OpenSSL
    [翻译] TLTagsControl
    [控件] BookTextView
    [控件] AngleGradientView
    【转】jQuery属性过滤选择器
    【转】ajax 跨域 headers JavaScript ajax 跨域请求 +设置headers 实践
    【转】PHP----JS相互调用
  • 原文地址:https://www.cnblogs.com/cotton/p/3795059.html
Copyright © 2020-2023  润新知