正确的表白方式(正则表达式)
Posted Java引导者
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了正确的表白方式(正则表达式)相关的知识,希望对你有一定的参考价值。
在学习知识之前,我们先来了解下最近的IT实况吧。最近大数据、人工智能炒的很火,不过AI是确确实实的要来了,自从AlphaGo Master战胜世界冠军柯洁,到AlphaGo Zero以100:0的战绩击败了AlphoGo后,AI就真的出现在了我们的视野里。2017年11月16日,世界百度大会在北京举行,人们问他最多的问题是:你坐无人车上五环有没有吃到罚单?李彦宏却答道:“确实收到了一张罚单,2018年量产无人驾驶汽车!”对于无人驾驶,基本共识是2020年可以实现无人驾驶车的量产,但作为创新者,百度不甘心,并希望在2018年7月实现无人驾驶小巴车的小规模量产及运营。之后又有Atlas人形机器人学会后空翻,人工智能的算法已经越来越先进,恐怕过不了多久,我们可能就会失业,一大批机器人就会出现在人类的视野里,但是,人类不必恐慌,因为强人工智能时代的到来还需要很长一段时间。
最近python语言比较火,这都跟机器学习以及AI脱不了干系,小编也自学了一点python,感叹于python的简便,但相对于C和java来说,运行速度就慢了许多,最近对爬虫比较感兴趣,所以就看了看正则表达式,虽然这仅仅是个小的知识点,但我还是对它的繁琐感到惊讶。
一、正则表达式概述
正则表达式,相信好多程序员对这个也不是很熟悉,因为它的语法比较繁琐。正则表达式是一种强大而灵活的文本处理工具,使用正则表达式,我们能够以编程的方式,构造复杂的文本模式,并对输入的紫福春进行搜索,一旦找到了匹配这些模式的部分,你就能随心所欲地对它们进行处理,如:字符串的匹配、选择、编辑以及验证。
一般来说,正则表达式就是以某种方式来描述字符串,因此你可以说:“如果一个字符串含有这些东西,那么它就是我正在找的东西。”例如:一个字符串其实就是一个简单的正则表达式,例如 Hello World 正则表达式匹配 "Hello World" 字符串。.(点号)也是一个正则表达式,它匹配任何一个字符如:"a" 或 "1"。故想要学会正则表达式,我们必须了解它的基本语法。
这些只是一些主要的正则表达式特殊字符,因为正则表达式特殊字符比较多,在这里就不再赘述。
在java中,要插入一个正则表达式的反斜线,必须要用“\\”,这与其他语言不同,python只需要使用一个反斜线就可以了,并且在前面加上r表示原生字符串即可。
语法匹配实例:
1、java中 : (-|\\+)? 这个正字表达式表示字符串的起始字符可能是一个-或+,或二者都没有(后面跟着?修饰符)。因为字符+表达式中有特殊的意义,所以必须使用\\将其转义,使之成为表达式中的一个普通字符。
2、python中: [\(]?\d{3}[\)-]?\d{8}|[\(]?\d{4}[\)-]?\d{7}
二、创建正则表达式
1、包类介绍
要构造功能强大的正则表达式对象,需要导入java.util.regex包。
Pattern 类:
pattern 对象是一个正则表达式的编译表示。Pattern 类没有公共构造方法。要创建一个 Pattern 对象,你必须首先调用其公共静态编译方法,它返回一个 Pattern 对象。该方法接受一个正则表达式作为它的第一个参数。
Matcher 类:
Matcher 对象是对输入字符串进行解释和匹配操作的引擎。与Pattern 类一样,Matcher 也没有公共构造方法。你需要调用 Pattern 对象的 matcher 方法来获得一个 Matcher 对象。
PatternSyntaxException:
PatternSyntaxException 是一个非强制异常类,它表示一个正则表达式模式中的语法错误。
2、如何创建?
(1)用static Pattern.compile()方法编译正则表达式,生成一个Pattern对象。
(2)把想要检索的字符串传入Pattern对象的matcher()方法,matcher()方法会生成一个Matcher对象。
(3)可使用Matcher对象的许多方法。(读者请参考API查看方法)
a. matches()方法对整个字符串进行匹配,只有整个字符串都匹配了才返回true。
b. lookingAt()方法对前面的字符串进行匹配,只有匹配到的字符串在最前面才返回true。
c. find()方法对字符串进行匹配,匹配到的字符串可以在任何位置。
Pattern与Matcher合作匹配正则表达式实例:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Test {
public static void main(String[] args) {
Pattern p = Pattern.compile("\\d+");
Matcher m1 = p.matcher("22gf66");
Matcher m2 = p.matcher("456423");
System.out.println(m1.matches());
System.out.println(m2.matches());
}
}
执行结果第一个返回false,第二个返回true。第二个与下面这段代码等价
boolean a = Pattern.matches("\\d+", "456423");
System.out.println(a);
又与下面这段代码等价
boolean a = Pattern.compile("\\d+").matcher("456423").matches();
System.out.println(a);
3、python中的正则表达式
学习了java中的正则表达式之后呢,学python的也简单很多了。python提供了re模块进行正则表达式的匹配功能,re模块中有许多函数进行字符串的查找,替换,分隔的操作。下面简单介绍几个常用函数吧。
findall(pattern,string,flags=0) 根据pattern在string中匹配字符串,匹配成功,返回匹配结果的列表,否则返回空列表,flags表示规则选项(初学者在此可忽略flags的一些特殊规则)。
match(pattern,string,flags=0)根据pattern从string的头部开始匹配字符串,只返回第一次匹配成功的对象,否则返回None。
compile(pattern,flags=0)编译正则表达式pattern,返回一个Pattern对象。
方法使用示例
import re
s = "hello world"
print(re.findall(r"\w+",s))
tell = "0791-1234567"
print(re.findall(r"\d{3}-\d{8}|\d{4}-\d{7}", tell))
s = "1afsd23gg88"
p = re.compile(r"\d+") #compile预编译返回一个pattern对象
print(p.findall(s))
第一个输出结果为['hello', 'world'],此处r表示后面的字符串为原生字符串,即不转义,使用真实字符。
第二个输出结果为['0791-1234567'],匹配成功。
第三个输出结果为['1', '23', '88']。
以上是关于正确的表白方式(正则表达式)的主要内容,如果未能解决你的问题,请参考以下文章