知识点
相关文章
更多最近更新
更多JAVA 正则表达式教程(超详细)二(续)
2019-03-16 18:57|来源: 陈广佳
第二点是,在本地号码位的前三位和后四位数字间有可能是空格符,而不是连字号,更有胜者,或根本就没有分隔符,就是7位数字连在一起。对这几种情况,我们可以用(-|)?来解决。这个结构的正则表达式就是转换器,它能匹配上面所说的几种情况。在()能含有管道符|时,它能匹配是否含有空格符或连字符,而尾部的?元字符表示是否根本没有分隔符的情况。
最后,区位号也可能没有包含在圆括号内,对此可以简单地在圆括号后附上?元字符,但这不是一个很好的解决方法。因为它也包含了不配对的圆括号,比如"(555" 或 "555)"。相反,我们可以通过另一种转换器来强迫让电话号码是否带有有圆括号:(/(/d{3}/)|/d{3})。如果我们把上面代码中的正则表达式用这些改进后的来替换的话,上面的代码就成了一个非常有用的电话号码数字匹配器:
Pattern pattern = Pattern.compile("(//(//d{3}//)|//d{3})//s?//d{3}(-|)?//d{4}");
可以确定的是,你可以自己试着进一步改进上面的代码。
现在看看第二个例子,它是从Friedl的中改编过来的。其功能是用来检查文本文件中是否有重复的单词,这在印刷排版中会经常遇到,同样也是个语法检查器的问题。
匹配单词,像其他的一样,也可以通过好几种的正则表达式来完成。可能最直接的是/b/w+/b,其优点在于只需用少量的regex元字符。其中/w元字符用来匹配从字母a到u的任何字符。+元字符表示匹配匹配一次或多次字符,/b元字符是用来说明匹配单词的边界,它可以是空格或任何一种不同的标点符号(包括逗号,句号等)。
现在,我们怎样来检查一个给定的单词是否被重复了三次?为完成这个任务,需充分利用正则表达式中的所熟知的向后扫描。如前面提到的,圆括号在正则表达式中有几种不同的用法,一个就是能提供组合类型,组合类型用来保存所匹配的结果或部分匹配的结果(以便后面能用到),即使遇到有相同的模式。在同样的正则表达中,可能(也通常期望)不止有一个组合类型。在第n个组合类型中匹配结果可以通过向后扫描来获取到。向后扫描使得搜索重复的单词非常简单:/b(/w+)/s+/1/b。
圆括号形成了一个组合类型,在这个正则表示中它是第一组合类型(也是仅有的一个)。向后扫描/1,指的是任何被/w+所匹配的单词。我们的正则表达式因此能匹配这样的单词,它有一个或多个空格符,后面还跟有一个与此相同的单词。注意的是,尾部的定位类型(/b)必不可少,它可以防止发生错误。如果我们想匹配"Paris in the the spring",而不是匹配"Java's regex package is the theme of this article"。根据java现在的格式,则上面的正则表达式就是:Pattern pattern =Pattern.compile("//b(//w+)//s+//1//b");
最后进一步的修改是让我们的匹配器对大小写敏感。比如,下面的情况:"The the theme of this article is the Java's regex package.",这一点在regex中能非常简单地实现,即通过使用在Pattern类中预定义的静态标志CASE_INSENSITIVE :
Pattern pattern =Pattern.compile("//b(//w+)//s+//1//b",
Pattern.CASE_INSENSITIVE);
有关正则表达式的话题是非常丰富,而且复杂的,用Java来实现也非常广泛,则需要对regex包进行的彻底研究,我们在这里所讲的只是冰山一角。即使你对正则表达式比较陌生,使用regex包后会很快发现它强大功能和可伸缩性。如果你是个来自Perl或其他语言王国的老练的正则表达式的黑客,使用过regex包后,你将会安心地投入到java的世界,而放弃其他的工具,并把java的regex包看成是手边必备的利器。
相关问答
更多-
在JAVA里面怎么使用正则表达式?[2022-03-09]
正则表达式的主要用法就是判断某个字符串是否符合某个固定的格式,以下是电话号码的格式判断: BufferedReader in; Pattern pattern = Pattern.compile("//(//d{3}//)//s//d{3}-//d{4}"); in = new BufferedReader(new FileReader("18046521658")); String s; while ((s = in.readLine()) != null) { Matcher m ... -
java正则表达式的用法[2023-05-19]
java.util.regex.Pattern返回由此匹配器解释的模式 java.util.regex.Matches ###regex里没有Matcher方法 尝试将整个区域与模式匹配。 如果匹配成功,则可以通过 start、end 和 group 方法获取更多信息。 返回: 当且仅当整个区域序列匹配此匹配器的模式时才返回 true。 -
java正则表达式[2023-08-29]
^ 和 $ 他们是分别用来匹配字符串的开始和结束,以下分别举例说明: "^The": 开头一定要有"The"字符串; "of despair$": 结尾一定要有"of despair" 的字符串; 那么, "^abc$": 就是要求以abc开头和以abc结尾的字符串,实际上是只有abc匹配。 "notice": 匹配包含notice的字符串。 你可以看见如果你没有用我们提到的两个字符(最后一个例子),就是说 模式(正则表达式) 可以出现在被检验字符串的任何地方,你没有把他锁定到两边。 接着,说说 '*', ... -
JAVA正则表达式[2024-05-06]
我这里有一份最基础的正则表达式的教程,要的话给我邮箱,我发给你! 对于邮箱这些的判断,你可以去搜集一下 如果你编程是用html5的话那已经自带了这些判断了! -
求JAVA正则表达式详细解释及常用JAVA正则表达式[2022-04-04]
http://www.ccw.com.cn/htm/app/aprog/01_7_31_4.asp 内容太多,不写了,自己去看看吧 -
关于JAVA正则表达式,详细点的。最好有例子。~~[2023-04-19]
给我邮箱,我发一份资料给你,是关于正则表达式的基础,也算挺详细的! -
java怎样通过正则表达式判断下面的IP[2022-04-12]
package com; public class Joey { public static void main(String[] args) { String ip = "10.1.107.0/24"; String reg = "^((2[0-4]\\d|25[0-5]|[01]?\\d\\d?)\\.){3}(2[0-4]\\d|25[0-5]|[01]?\\d\\d?)/\\d+$"; System.out.println(ip.matches(reg)); } } -
java正则表达式[2022-01-30]
^ 和 $ 他们是分别用来匹配字符串的开始和结束,以下分别举例说明: "^The": 开头一定要有"The"字符串; "of despair$": 结尾一定要有"of despair" 的字符串; 那么, "^abc$": 就是要求以abc开头和以abc结尾的字符串,实际上是只有abc匹配。 "notice": 匹配包含notice的字符串。 你可以看见如果你没有用我们提到的两个字符(最后一个例子),就是说 模式(正则表达式) 可以出现在被检验字符串的任何地方,你没有把他锁定到两边。 接着,说说 '*', ... -
java正则表达式",(?=[^\"]+?\",|[^\"]+?\"$)[2022-07-20]
我举例说明: x(?=y) ▲表示:右边紧跟y的x,但只包含x,不包含y x(?=y|z) ▲表示:右边紧跟y或z的x,但只包含x,不包含y或z x(?!y) ▲表示:右边不跟y的x,只包含x 你的这个正则表达式完全正确: ,(?=[^\"]+?\",|[^\"]+?\"$) ▲它只匹配1个, ▲▲但条件是: ▲条件1▲:此,右边到第1个",之间有至少1个不是"的字符 ▲条件2▲:此,右边到结尾的"之间有至少1个不是"的字符 举例说明: 它匹配下面3行中的前2个, (每次匹配1个,而不是同时匹配前2个) x ... -
java里正则表达式是什么意思啊[2023-10-21]
就是检查字符串是否符合某个格式 看我的例子 public class Judge { public static void main(String[] args) { String a="\\w{0,}\\@?\\w{0,}\\.{1,}\\w{0,}"; String str1="aaaa@"; String str2="aaaa"; String str3="aaaaa@111.com"; if(str1.matches(a)){ System.out.println(str1+"是1个E—mail地址 ...