快速提取正则匹配

快速提取正则匹配

我想从匹配regex模式的字符串中提取子字符串。

所以我在找这样的东西:

func matchesForRegexInText(regex: String!, text: String!) -> [String] {
   ???}

所以这就是我所拥有的:

func matchesForRegexInText(regex: String!, text: String!) -> [String] {

    var regex = NSRegularExpression(pattern: regex, 
        options: nil, error: nil)

    var results = regex.matchesInString(text, 
        options: nil, range: NSMakeRange(0, countElements(text))) 
            as Array<NSTextCheckingResult>

    /// ???
    return ...}

问题是,matchesInString给我一个数组NSTextCheckingResult,在哪里NSTextCheckingResult.range是类型的NSRange.

NSRange是不相容的Range<String.Index>,所以它阻止了我使用text.substringWithRange(...)

知道如何在没有太多代码行的情况下快速实现这个简单的事情吗?


收到一只叮咚
浏览 685回答 3
3回答

慕少森

我的答案建立在给定的答案之上,但通过添加额外的支持,使正则表达式匹配更加健壮:返回不仅匹配,而且返回所有捕获组对于每一场比赛(见下面的例子)而不是返回一个空数组,这个解决方案支持可选匹配避do/catch通过不打印到控制台和使用guard构造加matchingStrings作为扩展到StringSWIFT 4.2//:&nbsp;Playground&nbsp;-&nbsp;noun:&nbsp;a&nbsp;place&nbsp;where&nbsp;people&nbsp;can&nbsp;playimport&nbsp;Foundationextension&nbsp;String&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;func&nbsp;matchingStrings(regex:&nbsp;String)&nbsp;->&nbsp;[[String]]&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;guard&nbsp;let&nbsp;regex&nbsp;=&nbsp;try?&nbsp;NSRegularExpression(pattern:&nbsp;regex,&nbsp;options:&nbsp;[])&nbsp;else&nbsp;{&nbsp;return&nbsp;[]&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;nsString&nbsp;=&nbsp;self&nbsp;as&nbsp;NSString &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;results&nbsp;&nbsp;=&nbsp;regex.matches(in:&nbsp;self,&nbsp;options:&nbsp;[],&nbsp;range:&nbsp;NSMakeRange(0,&nbsp;nsString.length)) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;results.map&nbsp;{&nbsp;result&nbsp;in &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(0..<result.numberOfRanges).map&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result.range(at:&nbsp;$0).location&nbsp;!=&nbsp;NSNotFound &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;?&nbsp;nsString.substring(with:&nbsp;result.range(at:&nbsp;$0)) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;"" &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;}}"prefix12&nbsp;aaa3&nbsp;prefix45".matchingStrings(regex:&nbsp;"fix([0-9])([0-9])")//&nbsp;Prints:&nbsp;[["fix12",&nbsp;"1",&nbsp;"2"],&nbsp;["fix45",&nbsp;"4",&nbsp;"5"]]"prefix12" &nbsp;&nbsp;&nbsp;&nbsp;.matchingStrings(regex:&nbsp;"(?:prefix)?([0-9]+)")//&nbsp;Prints:&nbsp;[["prefix12",&nbsp;"12"]]"12".matchingStrings(regex:&nbsp;"(?:prefix)?([0-9]+)") &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Prints:&nbsp;[["12",&nbsp;"12"]],&nbsp;other&nbsp;answers&nbsp;return&nbsp;an&nbsp;empty&nbsp;array&nbsp;here//&nbsp;Safely&nbsp;accessing&nbsp;the&nbsp;capture&nbsp;of&nbsp;the&nbsp;first&nbsp;match&nbsp;(if&nbsp;any):let&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;number&nbsp;=&nbsp;"prefix12suffix".matchingStrings(regex:&nbsp;"fix([0-9]+)su").first?[1]//&nbsp;Prints:&nbsp;Optional("12")SWIFT 3//:&nbsp;Playground&nbsp;-&nbsp;noun:&nbsp;a&nbsp;place&nbsp;where&nbsp;people&nbsp;can&nbsp;playimport&nbsp;Foundationextension&nbsp;String&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;func&nbsp;matchingStrings(regex:&nbsp;String)&nbsp;->&nbsp;[[String]]&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;guard&nbsp;let&nbsp;regex&nbsp;=&nbsp;try?&nbsp;NSRegularExpression(pattern:&nbsp;regex,&nbsp;options:&nbsp;[])&nbsp;else&nbsp;{&nbsp;return&nbsp;[]&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;nsString&nbsp;=&nbsp;self&nbsp;as&nbsp;NSString &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;results&nbsp;&nbsp;=&nbsp;regex.matches(in:&nbsp;self,&nbsp;options:&nbsp;[],&nbsp;range:&nbsp;NSMakeRange(0,&nbsp;nsString.length)) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;results.map&nbsp;{&nbsp;result&nbsp;in &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(0..<result.numberOfRanges).map&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result.rangeAt($0).location&nbsp;!=&nbsp;NSNotFound &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;?&nbsp;nsString.substring(with:&nbsp;result.rangeAt($0)) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;"" &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;}}"prefix12&nbsp;aaa3&nbsp;prefix45".matchingStrings(regex:&nbsp;"fix([0-9])([0-9])")//&nbsp;Prints:&nbsp;[["fix12",&nbsp;"1",&nbsp;"2"],&nbsp;["fix45",&nbsp;"4",&nbsp;"5"]]"prefix12". &nbsp;&nbsp;&nbsp;&nbsp;matchingStrings(regex:&nbsp;"(?:prefix)?([0-9]+)")//&nbsp;Prints:&nbsp;[["prefix12",&nbsp;"12"]]"12".matchingStrings(regex:&nbsp;"(?:prefix)?([0-9]+)") &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Prints:&nbsp;[["12",&nbsp;"12"]],&nbsp;other&nbsp;answers&nbsp;return&nbsp;an&nbsp;empty&nbsp;array&nbsp;here//&nbsp;Safely&nbsp;accessing&nbsp;the&nbsp;capture&nbsp;of&nbsp;the&nbsp;first&nbsp;match&nbsp;(if&nbsp;any):let&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;number&nbsp;=&nbsp;"prefix12suffix".matchingStrings(regex:&nbsp;"fix([0-9]+)su").first?[1]//&nbsp;Prints:&nbsp;Optional("12")SWIFT 2extension&nbsp;String&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;func&nbsp;matchingStrings(regex:&nbsp;String)&nbsp;->&nbsp;[[String]]&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;guard&nbsp;let&nbsp;regex&nbsp;=&nbsp;try?&nbsp;NSRegularExpression(pattern:&nbsp;regex,&nbsp;options:&nbsp;[])&nbsp;else&nbsp;{&nbsp;return&nbsp;[]&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;nsString&nbsp;=&nbsp;self&nbsp;as&nbsp;NSString &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;results&nbsp;&nbsp;=&nbsp;regex.matchesInString(self,&nbsp;options:&nbsp;[],&nbsp;range:&nbsp;NSMakeRange(0,&nbsp;nsString.length)) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;results.map&nbsp;{&nbsp;result&nbsp;in &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(0..<result.numberOfRanges).map&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result.rangeAtIndex($0).location&nbsp;!=&nbsp;NSNotFound &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;?&nbsp;nsString.substringWithRange(result.rangeAtIndex($0)) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;"" &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;}}
打开App,查看更多内容
随时随地看视频慕课网APP