大家好,Android开发:深入解析Java正则表达式技巧与应用相信很多的网友都不是很明白,包括也是一样,不过没有关系,接下来就来为大家分享关于Android开发:深入解析Java正则表达式技巧与应用和的一些知识点,大家可以关注收藏,免得下次来找不到哦,下面我们开始吧!
反义
代码/语法说明W 匹配非字母、数字、下划线或汉字的任何字符S 匹配非空白字符的任何字符D 匹配非数字的任何字符B 匹配a不是单词开头或结尾的位置[^ x] 匹配任何字符,除了What to do?您可以使用括号指定子表达式(也称为组),然后可以指定子表达式的重复次数。您还可以对子表达式执行其他操作。
使用括号指定子表达式后,与子表达式匹配的文本(即本组捕获的内容)可以在表达式或其他程序中进一步处理。可以通过从左到右计算捕获组的左括号来对捕获组进行编号。例如,在表达式((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]?dd?(?#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]
贪婪与懒惰
语法说明 没有任何内容,但引用以下字符QNothing,但引用EENthing 之前的所有字符,但结束从Q 开始的引用如: Qw+ E 表示字符串w+ 而不是正则表达式中的单词字符: [ a-zA -Z_0-9]。
POSIX 字符类(仅 US-ASCII)
语法说明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) 启用。
其他
处理选项
模式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中的正则表达式与之前所说的不一致(多了一个)。在其他语言中,\意味着我想在正则表达式中插入一个普通的反斜杠。行,请不要给它任何特殊含义,而在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)
不同
regex包包括两个类,Pattern(模式类)和Matcher(匹配器类)。 Pattern类是用来表达和陈述搜索模式的对象,Matcher类是实际影响搜索的对象。添加了一个新的异常类PatternSyntaxException,当遇到非法搜索模式时会抛出异常。
String
简介
正则表达式的编译表示。
指定为字符串的正则表达式必须首先编译到此类的实例中。然后,生成的模式可用于创建一个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
java.util.regex
简介一种通过解释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());输出结果: imageappendTail
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钱的输入格式
有四种钱的表示形式我们可以接受:”10000.00″ 和 “10,000.00″, 和没有 “分” 的 “10000″ 和 “10,000″:^[1-9][0-9]*$ 这表示任意一个不以0开头的数字,但是,这也意味着一个字符”0″不通过,所以我们采用下面的形式:^(0|[1-9][0-9]*)$ 一个0或者一个不以0开头的数字.我们还可以允许开头有一个负号:^(0|-?[1-9][0-9]*)$ 这表示一个0或者一个可能为负的开头不为0的数字.让用户以0开头好了.把负号的也去掉,因为钱总不能是负的吧.下面我们要加的是说明可能的小数部分:^[0-9]+(.[0-9]+)?$ 必须说明的是,小数点后面至少应该有1位数,所以”10.”是不通过的,但是 “10″ 和 “10.2″ 是通过的:^[0-9]+(.[0-9]{2})?$ 这样我们规定小数点后面必须有两位,如果你认为太苛刻了,可以这样:^[0-9]+(.[0-9]{1,2})?$ 这样就允许用户只写一位小数。下面我们该考虑数字中的逗号了,我们可以这样:^[0-9]{1,3}(,[0-9]{3})*(.[0-9]{1,2})?$ 1到3个数字,后面跟着任意个 逗号+3个数字,逗号成为可选,而不是必须:^([0-9]+|[0-9]{1,3}(,[0-9]{3})*)(.[0-9]{1,2})?$ 备注:这就是最终结果了,别忘了”+”可以用””替代。如果你觉得空字符串也可以接受的话(奇怪,为什么?)最后,别忘了在用函数时去掉去掉那个反斜杠,一般的错误都在这里 (1)过滤出字母的正则表达式 [^(A-Za-z)](2) 过滤出 数字 的正则表达式 [^(0-9)] (3) 过滤出 中文 的正则表达式 [^([\u4e00-\u9fa5](file://u4e00-//u9fa5))](4) 过滤出字母、数字和中文的正则表达式好了,文章到这里就结束啦,如果本次分享的Android开发:深入解析Java正则表达式技巧与应用和问题对您有所帮助,还望关注下本站哦!
【Android开发:深入解析Java正则表达式技巧与应用】相关文章:
用户评论
我之前学过一些正则表达式,现在要用在安卓做开发真不错!
有14位网友表示赞同!
想问一下,Java里的正则表达式和其他语言有没有什么区别?
有20位网友表示赞同!
最近需要用到正则表达式来处理用户输入的电话号码,有什么好方法推荐吗?
有6位网友表示赞同!
学习Android开发,正则表达式是必备技能啊!
有13位网友表示赞同!
分享一下自己常用的Java正则表达式技巧呗?
有19位网友表示赞同!
想了解一下关于JAVA正则表达式测试的工具或网站。
有16位网友表示赞同!
有没有什么好用的IDE插件可以帮助我更方便地使用正则表达式呢?
有12位网友表示赞同!
学习Android开发的时候,这个知识点好像有点难懂…
有12位网友表示赞同!
希望能够找到一些详细的教程或者资源来学习Java正则表达式。
有9位网友表示赞同!
正则表达式可以用在很多地方,不仅仅限于Android开发吧?
有9位网友表示赞同!
Java正则表达式的语法不太容易掌握啊…
有16位网友表示赞同!
有没有什么简单易懂的例子来帮助我理解Java正则表达式的用法?
有8位网友表示赞同!
感觉学习正则表达式是一个不断积累的过程,需要多加练习才行!
有16位网友表示赞同!
最近在做一个小项目,遇到了用正则表达式处理文本的问题,求助大家的经验!
有10位网友表示赞同!