深入解析正则表达式:掌握高效文本处理技巧

更新:11-08 民间故事 我要投稿 纠错 投诉

这篇文章给大家聊聊关于深入解析正则表达式:掌握高效文本处理技巧,以及对应的知识点,希望对各位有所帮助,不要忘了收藏本站哦。

反义

代码/语法说明W 匹配非字母、数字、下划线或汉字的任何字符S 匹配非空白字符的任何字符D 匹配非数字的任何字符B 匹配a不是单词开头或结尾的位置[^ x] 匹配除x 之外的任何字符[^aeiou] 匹配除字母aeiou 之外的任何字符

分组

要重复单个字符,只需在该字符后面添加限定符即可,但是什么如果你想重复多个字符?您可以使用括号指定子表达式(也称为组),然后可以指定子表达式的重复次数。您还可以对子表达式执行其他操作。

使用括号指定子表达式后,与子表达式匹配的文本(即本组捕获的内容)可以在表达式或其他程序中进一步处理。可以通过从左到右计算捕获组的左括号来对捕获组进行编号。例如,在表达式((A)(B(C))) 中,有四个这样的组:

((A)(B(C)))(A)(B(C))(C)组零始终代表整个表达式。捕获组以这种方式命名,因为在匹配中,会保存与这些组匹配的输入序列的每个子序列。顺序。捕获的子序列稍后可以通过后向引用在表达式中使用,或者可以在匹配操作完成后从匹配器获取。

与组关联的捕获输入始终是与该组最接近的匹配子序列。如果由于量化而再次计算某个组,则当第二次计算失败时,将保留其先前捕获的值(如果有)。例如,将字符串“aba”与表达式(a(b)?)+ 匹配进行比较,将第二组设置为“b”。在每场比赛开始时,所有捕获的输入都将被丢弃。

以(?) 开头的组纯粹是非捕获组,它们不捕获文本,也不计入组总数。

反向引用用于重复搜索与前一组匹配的文本。例如:

b(w+)bs+1b 可用于匹配重复的单词,例如go go 或kitty kitty。

您还可以自己指定子表达式的组名称。要指定子表达式的组名,请使用以下语法:(?w+)(或将尖括号替换为":(?"Word"w+)),这样w+ 的组名就被指定作为词。要反向引用该组捕获的内容,可以使用k,因此前面的示例也可以这样写:b(?w+)bs+kb。

零宽断言

(?=exp) 也称为零宽度正向先行断言,它断言匹配的字符串以表达式exp 结尾,但不是结尾的一部分。例如,bw+(?=ingb) 匹配以ing 结尾的单词的前部(除ing 外)。例如,当搜索“我在唱歌,而你在跳舞”时,它会匹配“唱歌”和“跳舞”。

(?=exp) 也称为零宽度正向回溯断言,它断言自身之前的位置可以匹配表达式exp。例如,(?=bre)w+b 将匹配以re 开头的单词的后半部分(re 除外)。例如,当搜索“阅读一本书”时,它会匹配“广告”。

代码/语法描述(?=exp) 匹配exp 之前的位置(?=exp) 匹配exp 后面的位置(?exp) 匹配后面没有exp 的位置(? 匹配前面不是exp 的位置) :010 -1010 括号的另一种用法是通过语法(?#comment) 包含注释,例如:2[0-4]d(?#200-249)|25[0-5](?#250-255) 。 |[01]?d d?(?#0-199).

注释

语法说明*?重复任意次数,但尽可能少地重复+?重复1 次或多次,但尽可能少地重复?重复0 或1 次,但尽可能少地重复{n,m}可能的?重复n到m次,但尽可能少地重复{n,}?重复n次以上,但重复次数尽可能少。当正则表达式包含接受重复的限定符时,通常的行为是(在使整个表达式之前(在公式可以匹配的前提下)尽可能匹配)

可以有尽可能多的字符。考虑这个表达式:a.*b,它将匹配以a 开头并以b 结尾的最长字符串。如果你用它来搜索aabab

,它将匹配整个字符串aabab。这称为贪婪匹配。

有时,我们需要惰性匹配,即匹配尽可能少的字符。上面给出的限定符可以转换为惰性匹配模式,

就打个问号吗?在它之后。这样,*?意味着匹配任意次数的重复,但前提是整个匹配成功。

最少的重复。现在看一下示例的惰性版本:

a.*?b 匹配以a 开头并以b 结尾的最短字符串。如果将其应用于aabab,它将匹配aab(第一个到第三个字符

字符)和ab(第四到第五个字符)。

贪婪与懒惰

语法说明p{Lower} 小写字母字符:[a-z]p{Upper} 大写字母字符:[A-Z]p{ASCII} 所有ASCII:[x00-x7F]p{Alpha} 字母字符:[p{Lower}p{Upper}]p{Digit} 十进制数字:[0-9]p{Alnum} 字母数字字符:[p{Alpha}p{Digit}]p { Punct}标点符号:`!"#$%"()*+,-./:=?@[]^_{}~`p{Graph}可见字符:[p{Alnum}p {Punct }]p{Print}可打印字符:[p{Graph}x20]p{Blank} 空格或制表符:[ t]p{Cntrl} 控制字符:[x00- x1Fx7F] p{XDigit} 十六进制数字:[0-9a-fA-F]p{Space} 空白字符:[ tnx0Bfr]

POSIX 字符类(仅 US-ASCII)

语法说明 没有任何内容,但引用以下字符QNothing,但引用EENthing 之前的所有字符,但结束从Q 开始的引用如: Qw+ E 表示字符串w+ 而不是正则表达式中的单词字符: [ a-zA -Z_0-9]。

引用

语法说明xhh十六进制值为0xhh的字符uhhhh十六进制表示为Unicode字符0xhhhhttab字符Tabn换行符r回车f换页eescape(转义)

其他

上面介绍了几个选项,例如忽略大小写、处理多行等。这些选项可用于更改正则表达式的处理方式。以下是Java中常用的正则表达式选项:

名称说明CASE_INSENSITIVE 匹配区分大小写的MULTILINE 更改^ 和$ 的含义,以便它们分别匹配任何行的开头和结尾,而不是仅匹配整个字符串的开头和结尾。 (在此模式下,$ 的精确含义是: 匹配n 之前的位置以及字符串末尾之前的位置。) DOTALL 在dotall 模式下,表达式.可以匹配任何字符,包括行终止符。默认情况下,此表达式不匹配行终止符。 UNICODE_CASE 当指定此标志时,如果由CASE_INSENSITIVE 标志启用,则将以符合Unicode 标准的方式完成不区分大小写的匹配。默认情况下,假定不区分大小写的匹配仅匹配US-ASCII 字符集中的字符。还可以通过嵌入的标志表达式(?u) 启用支持Unicode 的大小写折叠。指定此标志可能会对性能产生影响。 CANON_EQ 启用规范等效。当指定此标志时,当且仅当两个字符的完整规范分解匹配时,两个字符才被视为匹配。例如,当指定此标志时,表达式"au030A" 与字符串"u00E5" 匹配。默认情况下,匹配不考虑规范等效性。没有嵌入的标志字符可以实现规范等效。指定此标志可能会对性能产生影响。 UNIX_LINES 启用Unix 行模式。在此模式下,^ 和$ 的行为中仅识别"n" 行终止符。 Unix 行模式也可以通过嵌入的标志表达式(?d) 启用。 LITERAL 当指定此标志时,指定模式的输入字符串将被视为文字字符序列。输入序列中的元字符或转义序列没有任何特殊含义。与此标志一起使用时,标志CASE_INSENSITIVE 和UNICODE_CASE 对匹配有影响。其他标志就变得多余了。没有嵌入的标志字符可以进行文字分析。 UNICODE_CHARACTER_CLASSCOMMENTS 模式下允许使用空格和注释。此模式忽略结束行之前的空格和以# 开头的嵌入注释。注释模式也可以通过嵌入的标志表达式(?x) 启用。

处理选项

JAVA

模式pattern=Pattern.compile("\ba\w*\b");

匹配器matcher=pattern.matcher("abcdab cccabcd aaacd");

整数索引=0;

while (matcher.find()) {

字符串res=matcher.group();

System.out.println(index + ":" + res);

索引++;

}\ba\w*\b 表示匹配以字母a 开头的单词。

Pattern.compile(regex) 表示将给定的正则表达式编译为具有给定标志的模式。

matcher(str) 创建一个匹配器,将给定输入与此模式进行匹配。

mather.find() 尝试查找输入序列中与模式匹配的下一个子序列。

此方法从匹配器区域的开头开始,或者,如果先前对此方法的调用成功并且此后匹配器尚未重置,则从先前匹配操作未匹配的第一个字符开始。

如果匹配成功,可以通过start、end、group方法获取更多信息。

group() 返回上一次匹配操作匹配到的输入子序列。

打印结果:

图片

基本用法

从上面的例子可以看出,Java中的正则表达式与之前所说的不一致(一更)。在其他语言中,\意味着我想在正则表达式中插入一个普通的反斜杠。请不要赋予它任何特殊含义,而在Java中,\表示我要插入正则表达式反斜杠,因此其后面的字符具有特殊含义。

如果要表示一个数字,那就是\d。如果你想插入一个普通的反斜杠,那就是\\。

不同

String类中有几种方法可以使用正则表达式:

方法返回类型函数示例matches() boolean 判断此字符串是否与给定的正则表达式匹配。 "-1234".matches("^-?\d+$")=truereplaceAll(String regex, String replacement)String 使用给定的替换来替换此字符串中与给定正则表达式匹配的所有子字符串。 "a1b2c3".replaceAll("[a-zA-z]", "")=123replaceFirst(String regex, String replacement)String 用给定的替换字符串替换与给定正则表达式匹配的该字符串的第一个子字符串。 "你好世界!大家好!".replaceFirst("\s", "")=HelloWorld!大家好!split(String regex)String[] 根据给定正则表达式的匹配拆分此字符串。 "boo:and:foo".split(":")={ "boo", "and", "foo" }split(String regex, int limit)String[] 根据给定正则表达式的匹配拆分此字符串。 "boo:and:foo".split(":", 5)={ "boo", "and", "foo" } split(String regex, int limit) 方法中的limit 参数控制应用模式的次数,从而影响结果数组的长度。如果限制n 大于0,则该模式将最多应用n - 1 次,数组的长度不会大于n,并且数组的最后一项将包含最后一个匹配分隔符之外的所有输入。如果n 为非正数,则该模式将被应用尽可能多次,并且数组可以是任意长度。如果n 为0,则该模式将被应用尽可能多次,数组可以是任意长度,并且终止空字符串将被丢弃。

例如,字符串“boo:and:foo”使用这些参数生成以下结果:

RegexLimit 结果:2{ "boo", "and:foo" }:5{ "boo", "and", "foo" }:-2{ "boo", "and", "foo" }o5{ "b", "" , ":and:f", "", "" }o-2{ "b", "", ":and:f", "", "" }o0{ "b", "", ":and:f" } str 调用此方法.split(regex, n) 形式产生与以下表达式完全相同的结果:Pattern.compile(regex).split(str, n)

String

regex包包括两个类,Pattern(模式类)和Matcher(匹配器类)。 Pattern类是用来表达和陈述搜索模式的对象,Matcher类是实际影响搜索的对象。添加了一个新的异常类PatternSyntaxException,当遇到非法搜索模式时会抛出异常。

java.util.regex

简介

正则表达式的编译表示。

指定为字符串的正则表达式必须首先编译到此类的实例中。然后,生成的模式可用于创建一个Matcher 对象,该对象根据正则表达式匹配任何字符序列。执行匹配所涉及的所有状态都驻留在匹配器中,因此多个匹配器可以共享相同的模式。

因此,典型的调用顺序是

模式p=Pattern.compile("a*b");

匹配器m=p.matcher("aaaaab");

boolean b=m.matches();当只使用一次正则表达式时,可以通过该类方便地定义matches 方法。此方法编译表达式并在一次调用中将输入序列与其匹配。陈述

boolean b=Pattern.matches("a*b", "aaaaab");与上面的三个语句等效,尽管它对于重复匹配效率不高,因为它不允许重用已编译的模式。

此类的实例是不可变的,并且可供多个并发线程安全使用。 Matcher 类的实例用于此目的并不安全。

常用方法

Pattern类中最重要的方法是compile和matcher,上面已经给出了例子。我们来看看其他方法:

方法返回类型函数示例flags()int 返回此模式的匹配标志。 Pattern.compile("\w*", Pattern.MULTILINE).flags()=8pattern()String 返回编译此模式的正则表达式。 Pattern.compile("\w*").pattern()=w*static quote(String s)String 返回指定String 的文字模式String。 Pattern.quote("\w+")=Qw+E

Pattern

简介一种通过解释Pattern 对字符序列执行匹配操作的引擎。

通过调用模式的匹配器方法从模式创建匹配器。创建匹配器后,您可以使用它来执行三种不同的匹配操作:

matches 方法尝试将整个输入序列与模式进行匹配。

LookingAt 尝试从头开始将输入序列与该模式进行匹配。

find 方法扫描输入序列以查找与模式匹配的下一个子序列。

每个方法都会返回一个布尔值,指示成功或失败。您可以通过查询匹配器的状态来获取有关成功匹配的更多信息。

匹配器在其输入的子集中(称为区域)查找匹配项。默认情况下,该区域包含所有匹配器输入。可以通过region方法修改区域,可以通过regionStart和regionEnd方法查询区域。区域边界与某些模式构造相互作用的方式可以改变。

该类还定义了用新字符串替换匹配子序列的方法,需要时可以根据匹配结果计算出新字符串的内容。您可以使用appendReplacement 和appendTail 方法将结果收集到现有的字符串缓冲区中,或者使用更方便的replaceAll 方法创建一个字符串,其中输入序列中的每个匹配子序列都可以被替换。

匹配器的显式状态包括最近成功匹配的开始和结束索引。它还包括模式中每个捕获组捕获的输入子序列的开始和结束索引以及该子序列的总数。为了方便起见,还提供了将这些捕获的子序列作为字符串返回的方法。

匹配器的显式状态最初是未定义的;在成功匹配之前尝试查询它的任何部分都会导致抛出IllegalStateException。每个匹配操作都会重新计算匹配器的显式状态。

匹配器的隐式状态由输入字符序列和添加位置组成,该位置最初为零,然后通过appendReplacement方法更新。

如果需要新的输入序列,可以通过调用其Reset() 方法或Reset(CharSequence) 方法来显式重置匹配器。重置匹配器会丢弃其显式状态信息并将添加位置设置为零。

多个并发线程使用此类的实例是不安全的。

常用的方法matches()表示字符串完全符合给定的正则表达式表示的范围。只要有一个字符不匹配,就返回false。喜欢:

Pattern.matches("[a-z]", "aAbBcC") 返回false,因为正则表达式表示的范围不包含大写字母。

find()find() 尝试查找输入序列中与该模式匹配的下一个子序列。

此方法从匹配器区域的开头开始,或者,如果先前对此方法的调用成功并且此后匹配器尚未重置,则从先前匹配操作未匹配的第一个字符开始。

如果匹配成功,可以通过start、end、group方法获取更多信息。

模式pattern=Pattern.compile("[a-z]");

匹配器matcher=pattern.matcher("aAbBcC");

匹配器.find();返回true,因为小写字母可以匹配。

需要注意的是,当执行find()方法时,其内部指针会发生相应的变化。比如第一次调用完成后,此时的matcher.start()为0,因为匹配到了第一个字母,而matcher.start()则为0。 end()返回2,因为它返回不匹配(A)的最后一个位置的下一个索引,所以可以通过以下方法看到指针移动轨迹:

模式p=Pattern.compile("\d{3,5}");

字符串s="123-34345-234-00";

while (m.find()) {

System.out.println(m.start() + "-" + m.end());

}打印结果:

正如你所看到的,find 方法更诚实,并且开始得好,结束得也好,但有时我们需要手动干预,而不是总是从头到尾这样做。这涉及到find 方法的另一种多态形式。

find(int start)从指定位置开始匹配,用该方法模拟find():

整数索引=0;

while (m.find(索引)) {

System.out.println(m.start() + "-" + m.end());

索引=m.end();

}lookingAt()该方法总是从头开始匹配,无论匹配与否,都立即返回对应的结果,不会继续匹配。语言很弱。这里用find方法来模拟:

公共静态无效主(字符串[] args)抛出异常{

模式p=Pattern.compile("\d{3,5}");

字符串s="123-34345-234-00";

匹配器m=p.matcher(s);

System.out.println(cosplayMethodLookingAt(m));

System.out.println(cosplayMethodLookingAt(m));

System.out.println(cosplayMethodLookingAt(m));

System.out.println(cosplayMethodLookingAt(m));

}

私有静态布尔cosplayMethodLookingAt(Matcher m) {

布尔res=m.find() m.start()==0;

m.reset();

返回资源;

}显示效果与lookingAt方法相同,但内部实现不同:

公共静态无效主(字符串[] args)抛出异常{

模式p=Pattern.compile("\d{3,5}");

字符串s="123-34345-234-00";

匹配器m=p.matcher(s);

m.find();

m.lookingAt();

m.find();

//4

System.out.println(m.start());

cosplay方法LookingAt(m);

m.find();

System.out.println(m.start());

}

私有静态布尔cosplayMethodLookingAt(Matcher m) {

布尔res=m.find() m.start()==0;

m.reset();

返回资源;

}打印结果:

可以看出,lookingAt方法并没有重置用于匹配的内部指针。

appendReplacement公共匹配器appendReplacement(StringBuffer sb,字符串替换)

实施非终端添加和替换步骤。

该方法执行以下操作:

它从追加位置开始读取输入序列中的字符,并将它们添加到给定的字符串缓冲区。它在读取上一个匹配之前的最后一个字符(即索引start() - 1 处的字符)后停止。

它将给定的替换字符串添加到字符串缓冲区。

它将这个匹配器的添加位置设置为最后一个匹配位置的索引加1,即end()。

替换字符串可能包含对先前匹配期间捕获的子序列的引用:每次出现的g 将被group(g) 的评估替换。每次出现g时,都会被group(g)的计算结果替换。之后的第一个数字始终被视为组引用的一部分。如果后续数字可以形成合法的组引用,则将它们合并到g中。只有数字“0”到“9”被认为是组引用的可能组成部分。例如,如果第二组与字符串“foo”匹配,则传递替换字符串“2bar”将导致“foobar”被添加到字符串缓冲区中。可能包含美元符号(2bar" 将导致"foobar" 添加到字符串缓冲区。可能包含美元符号() 作为替换字符串中的文字(通过在其前面添加反斜杠($))。

请注意,在替换字符串中使用反斜杠() 和美元符号($) 可能会导致与将字符串替换为文字不同的结果。

美元符号可视为到如上所述已捕获子序列的引用,反斜线可用于转义替换字符串中的字面值字符。 此方法设计用于循环以及 appendTail 和 find 方法中。例如,以下代码将 one dog two dogs in the yard 写入标准输出流中: Pattern p = Pattern.compile("cat"); Matcher m = p.matcher("one cat two cats in the yard"); StringBuffer sb = new StringBuffer(); while (m.find()) { m.appendReplacement(sb, "dog"); } m.appendTail(sb); System.out.println(sb.toString());输出结果: image

appendTail

StringBuffer appendTail(StringBuffer sb) 此方法从添加位置开始从输入序列读取字符,并将其添加到给定字符串缓冲区。可以在一次或多次调用 appendReplacement 方法后调用它来复制剩余的输入序列。 以上例来说,当匹配到第二个cat时,while语句块中的代码就失效了,此时后面的字符串s in the yard就需要使用appendTail方法来补齐,否则输出结果就是:

image显然有所缺失。

group

String group() 返回由以前匹配操作所匹配的输入子序列。 对于具有输入序列 s 的匹配器 m,表达式 m.group() 和 s.substring(m.start(), m.end()) 是等效的。 注意,某些模式(例如,a*)匹配空字符串。当模式成功匹配输入中的空字符串时,此方法将返回空字符串。

group(int group)

String group(int group) 返回在以前匹配操作期间由给定组捕获的输入子序列。 对于匹配器 m、输入序列 s 和组索引 g,表达式 m.group(g) 和 s.substring(m.start(g), m.end(g)) 是等效的。 捕获组是从 1 开始从左到右的索引。组零表示整个模式,因此表达式 m.group(0) 等效于 m.group()。 如果该匹配成功了,但指定组未能匹配输入序列的任何部分,则返回 null。注意,某些组(例如,(a*))匹配空字符串。当这些的组成功匹配输入中的空字符串时,此方法将返回空字符串。 Pattern p = Pattern.compile("\b\w+(o\w+)\b"); Matcher m = p.matcher("i love you"); while (m.find()) { System.out.println("整个匹配结果=>"+m.group()); System.out.println("一组匹配结果=>"+m.group(1)); }输出结果: image

其他

其他方法要么可以融会贯通,比如start(int),要么就是不常用,比如hasAnchoringBounds(),因此在需要的时候可以查看中文文档。 奉上连接:Matcher

常用正则

校验数字的表达式

数字:^[0-9]*$ n位的数字:^d{n}$ 至少n位的数字:^d{n,}$ m-n位的数字:^d{m,n}$ 零和非零开头的数字:^(0|[1-9][0-9]*)$ 非零开头的最多带两位小数的数字:^([1-9][0-9]*)+(.[0-9]{1,2})?$ 带1-2位小数的正数或负数:^(-)?d+(.d{1,2})?$ 正数、负数、和小数:^(-|+)?d+(.d+)?$ 有两位小数的正实数:^[0-9]+(.[0-9]{2})?$ 有1~3位小数的正实数:^[0-9]+(.[0-9]{1,3})?$ 非零的正整数:^[1-9]d*$或^([1-9][0-9]*){1,3}$或^+?[1-9][0-9]*$ 非零的负整数:^-[1-9][]0-9″*$或^-[1-9]d*$ 非负整数:^d+$或^[1-9]d*|0$ 非正整数:^-[1-9]d*|0$或^((-d+)|(0+))$ 非负浮点数:^d+(.d+)?$或^[1-9]d*.d*|0.d*[1-9]d*|0?.0+|0$ 非正浮点数:^((-d+(.d+)?)|(0+(.0+)?))$或^(-([1-9]d*.d*|0.d*[1-9]d*))|0?.0+|0$ 正浮点数:^[1-9]d*.d*|0.d*[1-9]d*$或^(([0-9]+.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*.[0-9]+)|([0-9]*[1-9][0-9]*))$ 负浮点数:^-([1-9]d*.d*|0.d*[1-9]d*)$或^(-(([0-9]+.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*.[0-9]+)|([0-9]*[1-9][0-9]*)))$ 浮点数:^(-?d+)(.d+)?$或^-?([1-9]d*.d*|0.d*[1-9]d*|0?.0+|0)$

校验字符的表达式

汉字:^[u4e00-u9fa5]{0,}$ 英文和数字:^[A-Za-z0-9]+$或^[A-Za-z0-9]{4,40}$ 长度为3-20的所有字符:^.{3,20}$ 由26个英文字母组成的字符串:^[A-Za-z]+$ 由26个大写英文字母组成的字符串:^[A-Z]+$ 由26个小写英文字母组成的字符串:^[a-z]+$ 由数字和26个英文字母组成的字符串:^[A-Za-z0-9]+$ 由数字、26个英文字母或者下划线组成的字符串:^w+$或^w{3,20}$ 中文、英文、数字包括下划线:^[u4E00-u9FA5A-Za-z0-9_]+$ 中文、英文、数字但不包括下划线等符号:^[u4E00-u9FA5A-Za-z0-9]+$或^[u4E00-u9FA5A-Za-z0-9]{2,20}$ 可以输入含有^%&",;=?$”等字符:[^%&",;=?$x22]+ 禁止输入含有~的字符:[^~x22]+

特殊需求表达式

Email地址:^w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*$ 域名:[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(/.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+/.? InternetURL:[a-zA-z]+://[^s]*或^http://([w-]+.)+[w-]+(/[w-./?%&=]*)?$ 手机号码:^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])d{8}$ 电话号码(“XXX-XXXXXXX”、”XXXX-XXXXXXXX”、”XXX-XXXXXXX”、”XXX-XXXXXXXX”、”XXXXXXX”和”XXXXXXXX):^($$d{3,4}-)|d{3.4}-)?d{7,8}$ 国内电话号码(0511-4405222、021-87888822):d{3}-d{8}|d{4}-d{7} 身份证号(15位、18位数字):^d{15}|d{18}$ 短身份证号码(数字、字母x结尾):^([0-9]){7,18}(x|X)?$ 或 ^d{8,18}|[0-9x]{8,18}|[0-9X]{8,18}?$ 帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$ 密码(以字母开头,长度在6~18之间,只能包含字母、数字和下划线):^[a-zA-Z]w{5,17}$ 强密码(必须包含大小写字母和数字的组合,不能使用特殊字符,长度在8-10之间):^(?=.*d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$ 日期格式:^d{4}-d{1,2}-d{1,2} 一年的12个月(01~09和1~12):^(0?[1-9]|1[0-2])$ 一个月的31天(01~09和1~31):^((0?[1-9])|((1|2)[0-9])|30|31)$ xml文件:^([a-zA-Z]+-?)+[a-zA-Z0-9]+\.[x|X][m|M][l|L]$ 中文字符的正则表达式:[u4e00-u9fa5] 双字节字符:[^x00-xff](包括汉字在内,可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)) 空白行的正则表达式:ns*r(可以用来删除空白行) HTML标记的正则表达式:<(S*?)[^>]*>.*?1>|<.*? />(网上流传的版本太糟糕,上面这个也仅仅能部分,对于复杂的嵌套标记依旧无能为力) 首尾空白字符的正则表达式:^s*|s*$或(^s*)|(s*$)(可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式) 腾讯QQ号:[1-9][0-9]{4,}(腾讯QQ号从10000开始) 中国邮政编码:[1-9]d{5}(?!d)(中国邮政编码为6位数字) IP地址:d+.d+.d+.d+(提取IP地址时有用) IP地址:((25[0-5]|2[0-4]d|((1d{2})|([1-9]?d))).){3}2

OK,关于深入解析正则表达式:掌握高效文本处理技巧和的内容到此结束了,希望对大家有所帮助。

用户评论

念初

这个技术好强大!感觉可以用来做很多事情

    有19位网友表示赞同!

落花忆梦

我听过这个,就是那个用来匹配字符串的东西吧?

    有6位网友表示赞同!

不相忘

好像有点复杂,我还是不太懂怎么回事.

    有15位网友表示赞同!

红玫瑰。

学习正则表达式感觉是每一个程序员必备的技能啊!

    有8位网友表示赞同!

初阳

正则匹配真是太强力了,可以轻松处理各种复杂的字符串模式。

    有12位网友表示赞同!

墨城烟柳

最近在用正则表达式做数据清洗,效率真是飞快

    有7位网友表示赞同!

话少情在

我有点想尝试一下,看看能不能用它来解决我现在遇到的问题

    有13位网友表示赞同!

良人凉人

这个可以用在网页开发吗? 可以用来验证用户输入吗?

    有18位网友表示赞同!

还未走i

是不是有很多种不同的正则表达式符号?需要好好学习一下。

    有5位网友表示赞同!

枫无痕

看到代码里那些复杂的花式正则表达式还是感觉很厉害的

    有17位网友表示赞同!

太难

有没有推荐一些好的正则表达式教程资源?

    有18位网友表示赞同!

冷风谷离殇

看视频学习似乎比较容易理解,不知道有没有推荐的视频?

    有16位网友表示赞同!

苍白的笑〃

正则表达式的应用场景非常广泛啊!

    有15位网友表示赞同!

一笑抵千言

感觉学起来应该蛮有挑战性的...

    有11位网友表示赞同!

今非昔比'

以后遇到字符串匹配的任务可以直接拿出来用吧?

    有12位网友表示赞同!

不识爱人心

比手动处理要高效得多,省时省力!

    有13位网友表示赞同!

顶个蘑菇闯天下i

这东西确实很有用的啊!

    有18位网友表示赞同!

无所谓

希望能够越学越好,掌握这个强大的工具。

    有17位网友表示赞同!

雁過藍天

以后可以用它来做更多有趣的事情了!

    有18位网友表示赞同!

【深入解析正则表达式:掌握高效文本处理技巧】相关文章:

1.蛤蟆讨媳妇【哈尼族民间故事】

2.米颠拜石

3.王羲之临池学书

4.清代敢于创新的“浓墨宰相”——刘墉

5.“巧取豪夺”的由来--米芾逸事

6.荒唐洁癖 惜砚如身(米芾逸事)

7.拜石为兄--米芾逸事

8.郑板桥轶事十则

9.王献之被公主抢亲后的悲惨人生

10.史上真实张三丰:在棺材中竟神奇复活

上一篇:精选美文:《酒婆》共享之旅 下一篇:常见误用成语解析:一文不值的真正含义与用法