• Java使用正则表达式匹配多行 Pattern flags


    Java中正则匹配有多种模式,若不选择模式则默认为单行匹配

    匹配模式(Pattern flags)

    compile()方法有两个模式

    未开匹配模式

    Pattern compile(String regex)

    开匹配模式

    Pattern compile(String regex, int flags)

    源码关于flags的描述

    Match flags, a bit mask that may include
            {@link #CASE_INSENSITIVE}, 
            {@link #MULTILINE}, 
            {@link #DOTALL},
            {@link #UNICODE_CASE}, 
            {@link #CANON_EQ}, 
            {@link #UNIX_LINES},
            {@link #LITERAL}, 
            {@link #UNICODE_CHARACTER_CLASS}
            and {@link #COMMENTS}    

    flags的取值 

    编译标志效果
    Pattern.CANON_EQ 当且仅当两个字符的"正规分解(canonical decomposition)"都完全相同的情况下,才认定匹配。比如用了这个标志之后,表达式"a/u030A"会匹配"?"。默认情况下,不考虑"规范相等性(canonical equivalence)"。
    Pattern.CASE_INSENSITIVE
    (?i)
    默认情况下,大小写不明感的匹配只适用于US-ASCII字符集。这个标志能让表达式忽略大小写进行匹配。要想对Unicode字符进行大小不明感的匹配,只要将UNICODE_CASE与这个标志合起来就行了。
    Pattern.COMMENTS
    (?x)
    在这种模式下,匹配时会忽略(正则表达式里的)空格字符(注:不是指表达式里的"//s",而是指表达式里的空格,tab,回车之类)。注释从#开始,一直到这行结束。可以通过嵌入式的标志来启用Unix行模式。
    Pattern.DOTALL
    (?s)
    在这种模式下,表达式'.'可以匹配任意字符,包括表示一行的结束符。默认情况下,表达式'.'不匹配行的结束符。
    Pattern.MULTILINE
    (?m)
    在这种模式下,'^'和'$'分别匹配一行的开始和结束。此外,'^'仍然匹配字符串的开始,'$'也匹配字符串的结束。默认情况下,这两个表达式仅仅匹配字符串的开始和结束。
    Pattern.UNICODE_CASE
    (?u)
    在这个模式下,如果你还启用了CASE_INSENSITIVE标志,那么它会对Unicode字符进行大小写不明感的匹配。默认情况下,大小写不明感的匹配只适用于US-ASCII字符集。
    Pattern.UNIX_LINES
    (?d)
    在这个模式下,只有'/n'才被认作一行的中止,并且与'.','^',以及'$'进行匹配。


    在这些标志里面,Pattern.CASE_INSENSITIVE,Pattern.MULTILINE,以及Pattern.COMMENTS是最有用的(其中Pattern.COMMENTS还能帮我们把思路理清楚,并且/或者做文档)。注意,你可以用在表达式里插记号的方式来启用绝大多数的模式。这些记号就在上面那张表的各个标志的下面。你希望模式从哪里开始启动,就在哪里插记号。

    可以用"OR" ('|')运算符把这些标志合使用

     下面详细说明下部分的用法

    1、Pattern.MULTILINE模式的用法

    正则表达式中出现了^或者$, 默认只会匹配第一行. 设置了Pattern.MULTILINE模式,会匹配所有行。例如:

    Pattern p1 = Pattern.compile("^.*b.*$");
    //输出false,因为正则表达式中出现了^或$,默认只会匹配第一行,第二行的b匹配不到。
    System.out.println(p1.matcher("a
    b").find());
    Pattern p2 = Pattern.compile("^.*b.*$",Pattern.MULTILINE);
    //输出true,指定了Pattern.MULTILINE模式,就可以匹配多行了。
    System.out.println(p2.matcher("a
    b").find());

    2、Pattern.DOTALL模式的用法

    默认情况下, 正则表达式中点(.)不会匹配换行符, 设置了Pattern.DOTALL模式, 才会匹配所有字符包括换行符。例如:

    Pattern p1 = Pattern.compile("a.*b");
    //输出false,默认点(.)没有匹配换行符
    System.out.println(p1.matcher("a
    b").find());
    Pattern p2 = Pattern.compile("a.*b", Pattern.DOTALL);
    //输出true,指定Pattern.DOTALL模式,可以匹配换行符。
    System.out.println(p2.matcher("a
    b").find());

    3、同时指定Pattern.MULTILINE和Pattern.DOTALL模式

    实际情况中要是比较复杂的情况,可能Pattern.MULTILINE模式和Pattern.DOTAL模式需要同时指定来匹配多行

    Pattern p1 = Pattern.compile("^a.*b$");
    //输出false
    System.out.println(p1.matcher("cc
    a
    b").find());
    Pattern p2 = Pattern.compile("^a.*b$", Pattern.DOTALL);
    //输出false,因为有^或&没有匹配到下一行
    System.out.println(p2.matcher("cc
    a
    b").find());
    Pattern p3 = Pattern.compile("^a.*b$", Pattern.MULTILINE);
    //输出false,匹配到下一行,但.没有匹配换行符
    System.out.println(p3.matcher("cc
    a
    b").find());
    //指定多个模式,中间用|隔开
    Pattern p4 = Pattern.compile("^a.*b$", Pattern.DOTALL|Pattern.MULTILINE);
    //输出true
    System.out.println(p4.matcher("cc
    a
    b").find());

    参考:

    https://www.cnblogs.com/xyou/p/7427779.html

    https://www.cjavapy.com/article/68/

  • 相关阅读:
    Sagit.Framework For IOS 自动布局教程:14、UIScrollView 特殊用法
    Sagit.Framework For IOS 自动布局教程:13、UIImage、UIImageView 图片压缩、(长按)保存、缩放、(列表)放大浏览、生成验证码。
    Sagit.Framework For IOS 自动布局教程:12、UIButton、UILabel、UITextField、UITextView 特殊用法介绍
    Sagit.Framework For IOS 自动布局教程:10、获取px的宽高坐标、元素移动、刷新布局、自适应大小、聊天消息背景图片拉伸。
    Sagit.Framework For IOS 自动布局教程:11、常用宏定义:frame坐标系、获取UI、UI取值、字体颜色、图片
    Sagit.Framework For IOS 自动布局教程:7、底部Tab栏
    Sagit.Framework For IOS 自动布局教程:8、UIView通用事件:点击、双击、长按、拖动、滑动。
    Sagit.Framework For IOS 自动布局教程:9、UI元素的类型转换as
    Sagit.Framework For IOS 自动布局教程:6、导航栏
    Sagit.Framework For IOS 自动布局教程:5、状态栏
  • 原文地址:https://www.cnblogs.com/mengw/p/11454848.html
Copyright © 2020-2023  润新知