正则表达式--位置匹配和组

1. 位置匹配

正则中的匹配有两种,一种是匹配具体的字符,另一种是匹配特定的位置

^    匹配文本开始位置

$    匹配文本结束位置

\b   匹配单词边界(单词开始位置或结束位置)

校验操作时,是否使用 ^和$ 对校验操作没有影响

获取、替换等操作时,一般不使用 ^和$

String regex = "\\bhello\\b";
        String str = "xx hello,hello helloa ";

        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(str);

        while (matcher.find())
        {
            String group = matcher.group();
            System.out.println(group);
        }

输出:

hello
hello

2. 组

正则使用 ( ) 表示一个组,组可以让若干字符形成一个小整体

(ab)     匹配 ab

(red|blue|green)   匹配 red 或者 blue 或者 green

(red|blue|green) color   匹配 red color 或者 blue color 或者 green color

在匹配时,组的当前 "取值" 会被临时保存起来,方便引用。可以使用 \1 引用第一个组的当前"取值",最多可以引用九个不同的组:\9

(ab)c\1   匹配 abcab

([ab])\1   匹配 aa 或者 bb

(a)(b)\1\2   匹配 abab

	String regex = "(a)(b)\\1\\2";
        String str = "abab";

        boolean match = Pattern.matches(regex, str);
        System.out.println(match);

输出:

true

3.标记flag

标记用来额外指定正则的匹配策略(标记可以不写在正则表达式内)

i         大小写不敏感  insensitive(也可以理解成ignore)

g        全局匹配  global 效果是可以依次的获取到和正则匹配的所有子字符串

m       多行匹配  multiline 效果是^和$可以匹配一段文本中每行的开始和结束位置

在Java中:

在创建正则对象时可以通过 Pattern.compile(regex, flags)  指定标记

使用Pattern.CASE_INSENSITIVE 常量表示 i

使用Pattern.MULTILINE 常量表示 m

正则操作默认就是全局匹配的

String regex = "\\bhello\\b";
        String str = "xx Hello,heLLo helloa ";

        // Pattern pattern = Pattern.compile(regex);
        Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
        Matcher matcher = pattern.matcher(str);

        while (matcher.find()) {
            String group = matcher.group();
            System.out.println(group);
        }

输出:

Hello
heLLo

4.常用正则表达式

校验数字:^[0-9]*$

校验整数或者小数:^[0-9]+([.][0-9]+){0,1}$

校验qq号:[1-9][0-9]{4,}

校验手机号:  ^1[34578]\d{9}$

校验身份证:(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|x|X)$)

校验日期(格式:yyyy-mm-dd,已考虑平闰年):^(?:(?!0000)[0-9]{4}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-8])|(?:0[13-9]|1[0-2])-(?:29|30)|(?:0[13578]|1[02])-31)|(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:0[48]|[2468][048]|[13579][26])00)-02-29)$

校验email地址:^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$

校验URL:^[a-zA-z]+://[^\s]*$

注意:以上常用正则并不保证完全满足需求,使用前请充分测试

原文地址:https://www.cnblogs.com/renjing/p/regex-flag.html

时间: 2024-10-09 11:41:27

正则表达式--位置匹配和组的相关文章

正则表达式(四)——位置匹配(环视、单词分界符、锚点)

这次的内容是有关于正则表达式中的位置匹配,它包含的内容有两部分,一部分是较为简单的锚点和单词分界符,一部分是较为复杂的零宽断言.复杂有复杂的好处,写起来复杂,能匹配的位置也就越复杂.零宽断言又可以叫做环视.这一部分是重点内容. 锚点 标准的锚点有这么几个,它们是^,$.在普遍的,不涉及任何模式的情况下,脱字符(^)匹配的是文本的起始位置.而$匹配的则是文本末尾的换行符\n之前的位置.举个例子 正则表达式:s$ 上面这个正则表达式的意思就是匹配以字符[s]结尾的行,即[······s/n]这样的字

正则表达式——从匹配北美电话号码和邮箱地址学习

一般北美电话号码的格式为: 999-999-9999 或者999x999x9999 (x表示任意字符) 用字符组来匹配: [0-9][0-9][0-9]-[0-9][0-9][0-9]-[0-9][0-9][0-9][0-9] 用字符组简写式: \d\d\d-\d\d\d-\d\d\d\d 括选文字符: ^(\(\d{3}\)|^\d{3}[.-]?)?\d{3}[.-]?\d{4}$ 第一个^表示电话号码会出现在一行的起始位置 左括号{为捕获分组的起始符 \(表示左括号本身(转义字符) \d匹

【转】正则表达式的匹配规则

转自http://www.cnblogs.com/xiaohuochai/p/5608807.html 元字符 大部分字符在正则表达式中,就是字面的含义,比如/a/匹配a,/b/匹配b /dog/.test("old dog") // true 但还有一些字符,它们除了字面意思外,还有着特殊的含义,这些字符就是元字符 在javascript中,共有14个元字符(meta-character) () [] {} \ ^ $ | ? * + . 元字符 名称 匹配对象 . 点号 单个任意字

JS 正则表达式否定匹配(正向前瞻)

引言:JS 正则表达式是 JS 学习过程中的一大难点,繁杂的匹配模式足以让人头大,不过其复杂性和其学习难度也赋予了它强大的功能.文章从 JS 正则表达式的正向前瞻说起,实现否定匹配的案例.本文适合有一定 JS 正则表达式基础的同学,如果对正则表达式并不了解,还需先学习基础再来观摩这门否定大法. 一.标签过滤需求 不知道大家在写JS有没有遇到过这样的情况,当你要处理一串字符串时,需要写一个正则表达式来匹配当中不是 XXX 的文本内容.听起来好像略有些奇怪,匹配不是 XXX 的内容,不是 XXX 我

JavaScript中正则表达式判断匹配规则以及常用的方法

JavaScript中正则表达式判断匹配规则以及常用的方法: 字符串是编程时涉及到的最多的一种数据结构,对字符串进行操作的需求几乎无处不在. 正则表达式是一种用来匹配字符串的强有力的武器.它的设计思想是用一种描述性的语言来给字符串定义一个规则,凡是符合规则的字符串,我们就认为它"匹配"了. \d可以匹配一个数字                 '00\d'可以匹配'007' ,'\d\d\d'可以匹配'010' \w可以匹配一个字母或数字      '\w\w'可以匹配'js' \s可

正则表达式之匹配替换

最近做word脚注用到了正则表达式的匹配替换功能.我提取rtf字符串中书签的名称,更改名称后,再替换到字符串中.看代码: 1 var range = fd_Field.Result.Footnotes[1].Range; 18 str_Content = Regex.Replace(str_Content, @"\\bkmk(start|end) _(\w+)}", "\\bkmk$1 _$2_" + fid + "}", RegexOption

【RegExp】JavaScript中正则表达式判断匹配规则以及常用方法

字符串是编程时涉及到的最多的一种数据结构,对字符串进行操作的需求几乎无处不在. 正则表达式是一种用来匹配字符串的强有力的武器.它的设计思想是用一种描述性的语言来给字符串定义一个规则,凡是符合规则的字符串,我们就认为它"匹配"了. \d可以匹配一个数字                 '00\d'可以匹配'007' ,'\d\d\d'可以匹配'010' \w可以匹配一个字母或数字      '\w\w'可以匹配'js' \s可以匹配一个空格(也包括Tab等空白符) \DWS都是表示匹配与

Java正则表达式中的捕获组的概念(转)

要弄清这三个方法,首先要弄清Java正则表达式中的捕获组的概念.捕获组也就是Pattern中以括号对“()”分割出的子Pattern.至于为什么要用捕获组呢,主要是为了能找出在一次匹配中你更关心的部分.捕获组可以通过从左到右计算其开括号来编号.例如,在表达式 "(x)(y\\w*)(z)" 中,存在三个这样的组:  1.  x2.  y\\w*3.  z组零始终代表整个表达式.之所以这样命名捕获组是因为在匹配中,保存了与这些组匹配的输入序列的每个子序列.捕获的子序列稍后可以通过 Bac

第六章:位置匹配

6.1 边界: 文本: The cat scattered his food all over the room. 正则表达式: cat 结果: The cat scattered his food all over the room. 分析: cat将单词scattered 中的cat也匹配出来了,如果说现在想把cat替换成dog那么这么匹配是有问题的 6.2 单词边界: 第一种边界是由限定字符\b指定的单词边界,\b用来匹配一个单词的开始或者结尾 文本: The cat scattered