正则表达式基础

正则表达式的作用:

通过一个规则,筛选和快速匹配出符合规则的字符串,是专门用于字符串处理的一种语言。比如常用的匹配手机号、邮箱地址、网页地址、账户格式、QQ号等等


如何写一个表达式:

[] 这个括起来标示一位
比如要匹配
第一位是英文字母:[a-zA-Z]
第一位是数字:[0-9]

匹配多位:[]{}
比如匹配3个连续数字:[0-9]{3} 或者 \\d{3}    →   \\d = [0-9] 
比如匹配3~5个连续的字母: [a-zA-Z]{3,5}

其中最经常是用的有:
*          重复零次或更多次
+          重复一次或更多次
?          重复零次或一次
{n}        重复n次
{n,}       重复n次或更多次
{n,m}      重复n到m次,
.          匹配除换行符以外的任意字符


Swift中有哪些匹配方法:

//根据规则匹配一个字符串,返回NSTextCheckingResult数组
 open func matches(in string: String, options: NSRegularExpression.MatchingOptions = [], range: NSRange) -> [NSTextCheckingResult]
 //根据规则匹配一个字符串,返回匹配到的个数
 open func numberOfMatches(in string: String, options: NSRegularExpression.MatchingOptions = [], range: NSRange) -> Int
 //根据规则匹配一个字符串,返回NSTextCheckingResult
 open func firstMatch(in string: String, options: NSRegularExpression.MatchingOptions = [], range: NSRange) -> NSTextCheckingResult?
 //根据规则匹配一个字符串,返回匹配到的第一范围
 open func rangeOfFirstMatch(in string: String, options: NSRegularExpression.MatchingOptions = [], range: NSRange) -> NSRange


Swift中有哪些匹配设置:

 caseInsensitive                : 忽略大小写
 allowCommentsAndWhitespace     : 忽略空白字符,以及前缀是 # 开始的注释
 ignoreMetacharacters           : 将整个匹配方案作为文字字符串
 dotMatchesLineSeparators       : 允许 . 匹配任意字符,包括回车换行
 anchorsMatchLines              : 允许 ^ 和 $ 匹配多行文本的开始和结尾
 useUnixLineSeparators          :  = 1 << 5, 仅将 \n 作为换行符
 useUnicodeWordBoundaries       :  = 1 << 6 使用 Unicode TR#29 指定单词边界


举例:匹配QQ号

普通的方法去匹配:

// 普通的判断方法
    private func checkQQ(qqStr : String) -> Bool{
        /*
         1、不能以0开头
         2、在5到15位之间
         3、必须是全数字
         */
        
        if qqStr.hasPrefix("0") {
            return false
        }
        
        if qqStr.characters.count < 5 || qqStr.characters.count > 15 {
            return false
        }
        
        for c in qqStr.characters{
            if c < "0" || c > "9" {
                return false
            }
        }
        
        return true
        
    }


使用正则表达式:

    //正则
    private func checkQQRegex(qqStr : String) -> Bool{
        do {
            //1、创建规则
            let pattern = "[1-9][0-9]{4,14}"
            
            //2、创建正则表达式
            let regex = try NSRegularExpression(pattern: pattern, options: NSRegularExpression.Options.caseInsensitive)
            
            //3、匹配
            let range = regex.rangeOfFirstMatch(in: qqStr, options: NSRegularExpression.MatchingOptions(rawValue : 0), range: NSRange(location: 0, length: qqStr.characters.count))
            
            if range.location == 0 && range.length >= 5 {
                return true
            }
            
        } catch{
            print(error)
        }
        
        return false
        
    }



正则表达式匹配手机号码

 private func checkPhoneNum(phone : String) -> Bool{
        /*
         1、第一位必须是1
         2、第二位是:3 5 7 8 
         3、长度要是11位数
         4、必须全部是数字
         */
        //1、创建规则
        let pattern = "[1][3578]\\d{9}"
        do {
            //2、创建匹配对象
            let regex = try NSRegularExpression(pattern: pattern, options: NSRegularExpression.Options.caseInsensitive)
            
            //3、匹配
            let range = regex.rangeOfFirstMatch(in: phone, options: NSRegularExpression.MatchingOptions(rawValue : 0), range: NSRange(location: 0, length: phone.characters.count))
            if range.location == 0 && range.length == 11 {
                return true
            }
            
        } catch{
            print(error)
        }
        return false
        
    }


系统提供的正则

NSDataDetector,当我们进入之后可以发现他就是NSRegular...的子类,所以得知
这是苹果给我们封装的一个正则表达式对象。

@available(iOS 4.0, *)
open class NSDataDetector : NSRegularExpression {

    
    public init(types checkingTypes: NSTextCheckingTypes) throws

    
    open var checkingTypes: NSTextCheckingTypes { get }
}

这个类提供的创建方法就一个,所以使用起来很简单。

使用思路和之前基本类似:

  • 1、创建对象并设置规则
  • 2、开始匹配



例子演示:匹配字符串中的时间

    func systemRegular(){
        do {
            //字符串
            let regexStr = "撒的发生的发生的 2016-11-24 13:11:21 士大夫撒旦法"
            
            /// 创建对象
            let regex = try NSDataDetector.init(types:NSTextCheckingResult.CheckingType.date.rawValue)
            //匹配
            let res = regex.matches(in: regexStr, options: NSRegularExpression.MatchingOptions.init(rawValue: 0), range: NSRange(location: 0, length: regexStr.characters.count))
            //打印截取字符串
            for result in res {
                print((regexStr as NSString).substring(with: result.range))
            }
        } catch  {
            //如果出错了,输出错误
            print(error)
        }
    }
最后打印:
2016-11-24 13:11:21


官方描述
NSTextCheckingResult is a class used to describe items located by text checking. Each of these objects represents something that has been found during checking--a misspelled word, a sentence with grammatical issues, a detected URL, a straight quote to be replaced with curly quotes, and so forth.
NSTextCheckingResult是一个类,用于描述通过文本检查定位的项。 这些对象中的每一个表示在检查期间发现的东西 - 拼写错误的单词,具有语法问题的句子,检测到的URL,要用卷曲引号替换的直引号等等。



系统提供的匹配规则类型:

        提供了很多种给我们使用
        public static var orthography: NSTextCheckingResult.CheckingType { get } // language identification

        public static var spelling: NSTextCheckingResult.CheckingType { get } // spell checking

        public static var grammar: NSTextCheckingResult.CheckingType { get } // grammar checking

        public static var date: NSTextCheckingResult.CheckingType { get } // date/time detection

        public static var address: NSTextCheckingResult.CheckingType { get } // address detection

        public static var link: NSTextCheckingResult.CheckingType { get } // link detection

        public static var quote: NSTextCheckingResult.CheckingType { get } // smart quotes

        public static var dash: NSTextCheckingResult.CheckingType { get } // smart dashes

        public static var replacement: NSTextCheckingResult.CheckingType { get } // fixed replacements, such as copyright symbol for (c)

        public static var correction: NSTextCheckingResult.CheckingType { get } // autocorrection

        @available(iOS 4.0, *)
        public static var regularExpression: NSTextCheckingResult.CheckingType { get } // regular expression matches

        @available(iOS 4.0, *)
        public static var phoneNumber: NSTextCheckingResult.CheckingType { get } // phone number detection

        @available(iOS 4.0, *)
        public static var transitInformation: NSTextCheckingResult.CheckingType { get } // transit (e.g. flight) info detection


各种表达式入口

Demo入口



所有的正则表达式符号如下:来源百度,太多了记不住

\

将下一个字符标记符、或一个向后引用、或一个八进制转义符。例如,“\\n”匹配\n。“\n”匹配换行符。序列“\\”匹配“\”而“\(”则匹配“(”。即相当于多种编程语言中都有的“转义字符”的概念。

^

匹配输入字符串的开始位置。如果设置了RegExp对象的Multiline属性,^也匹配“\n”或“\r”之后的位置。

$

匹配输入字符串的结束位置。如果设置了RegExp对象的Multiline属性,$也匹配“\n”或“\r”之前的位置。

*

匹配前面的子表达式任意次。例如,zo*能匹配“z”,也能匹配“zo”以及“zoo”。

+

匹配前面的子表达式一次或多次(大于等于1次)。例如,“zo+”能匹配“zo”以及“zoo”,但不能匹配“z”。+等价于{1,}。

?

匹配前面的子表达式零次或一次。例如,“do(es)?”可以匹配“do”或“does”中的“do”。?等价于{0,1}。

{n}

n是一个非负整数。匹配确定的n次。例如,“o{2}”不能匹配“Bob”中的“o”,但是能匹配“food”中的两个o。

{n,}

n是一个非负整数。至少匹配n次。例如,“o{2,}”不能匹配“Bob”中的“o”,但能匹配“foooood”中的所有o。“o{1,}”等价于“o+”。“o{0,}”则等价于“o*”。

{n,m}

m和n均为非负整数,其中n<=m。最少匹配n次且最多匹配m次。例如,“o{1,3}”将匹配“fooooood”中的前三个o。“o{0,1}”等价于“o?”。请注意在逗号和两个数之间不能有空格。

?

当该字符紧跟在任何一个其他限制符(*,+,?,{n},{n,},{n,m})后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串“oooo”,“o+?”将匹配每个“o”即4次匹配,而“o+”将只匹配1次即匹配“oooo”。

.点

匹配除“\r\n”之外的任何单个字符。要匹配包括“\r\n”在内的任何字符,请使用像“[\s\S]”的模式。

(pattern)

匹配pattern并获取这一匹配。所获取的匹配可以从产生的Matches集合得到,在VBScript中使用SubMatches集合,在JScript中则使用$0…$9属性。要匹配圆括号字符,请使用“\(”或“\)”。

(?:pattern)

非获取匹配,匹配pattern但不获取匹配结果,不进行存储供以后使用。这在使用或字符“(|)”来组合一个模式的各个部分是很有用。例如“industr(?:y|ies)”就是一个比“industry|industries”更简略的表达式。

(?=pattern)

非获取匹配,正向肯定预查,在任何匹配pattern的字符串开始处匹配查找字符串,该匹配不需要获取供以后使用。例如,“Windows(?=95|98|NT|2000)”能匹配“Windows2000”中的“Windows”,但不能匹配“Windows3.1”中的“Windows”。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。

(?!pattern)

非获取匹配,正向否定预查,在任何不匹配pattern的字符串开始处匹配查找字符串,该匹配不需要获取供以后使用。例如“Windows(?!95|98|NT|2000)”能匹配“Windows3.1”中的“Windows”,但不能匹配“Windows2000”中的“Windows”。

(?<=pattern)

非获取匹配,反向肯定预查,与正向肯定预查类似,只是方向相反。例如,“(?<=95|98|NT|2000)Windows”能匹配“2000Windows”中的“Windows”,但不能匹配“3.1Windows”中的“Windows”。

(?
匹配词(word)的开始(<)和结束(>)。例如正则表达式能够匹配字符串"for the wise"中的"the",但是不能匹配字符串"otherwise"中的"the"。注意:这个元字符不是所有的软件都支持的。

( )
将( 和 ) 之间的表达式定义为“组”(group),并且将匹配这个表达式的字符保存到一个临时区域(一个正则表达式中最多可以保存9个),它们可以用 \1 到\9 的符号来引用。

|
将两个匹配条件进行逻辑“或”(Or)运算。例如正则表达式(him|her) 匹配"it belongs to him"和"it belongs to her",但是不能匹配"it belongs to them."。注意:这个元字符不是所有的软件都支持的。

+
匹配1或多个正好在它之前的那个字符。例如正则表达式9+匹配9、99、999等。注意:这个元字符不是所有的软件都支持的。

?
匹配0或1个正好在它之前的那个字符。注意:这个元字符不是所有的软件都支持的。

{i} {i,j}
匹配指定数目的字符,这些字符是在它之前的表达式定义的。例如正则表达式A[0-9]{3} 能够匹配字符"A"后面跟着正好3个数字字符的串,例如A123、A348等,但是不匹配A1234。而正则表达式[0-9]{4,6} 匹配连续的任意4个、5个或者6个数字

你可能感兴趣的:(正则表达式基础)