regex - swift 2 NSRegularExpression

标签 regex swift

最终我希望能够输入类似“\mycard{front1}{back1}\mycard{front2}{back2}\mycard{front3}{back3}” 的字符串并返回每张卡片的正面和背面。

我在 NSRegularExpression 上找到了这个网站,但我很难根据我的问题调整它。

这是我目前所拥有的。

import Foundation

func rangeFromNSRange(nsRange: NSRange, forString str: String) -> Range<String.Index>? {
    let fromUTF16 = str.utf16.startIndex.advancedBy(nsRange.location, limit: str.utf16.endIndex)
    let toUTF16 = fromUTF16.advancedBy(nsRange.length, limit: str.utf16.endIndex)

    if let from = String.Index(fromUTF16, within: str), let to = String.Index(toUTF16, within: str) {
        return from ..< to
    }

    return nil
}

do {
    // let input = "My name is Taylor Swift"
    // let regex = try NSRegularExpression(pattern: "My name is (.*)", options: NSRegularExpressionOptions.CaseInsensitive)

    let input = "mycard{front}{back}"
    let regex = try NSRegularExpression(pattern: "mycard{(.*)}{(.*)}", options: NSRegularExpressionOptions.CaseInsensitive)

    let matches = regex.matchesInString(input, options: [], range: NSMakeRange(0, input.characters.count))

    if let match = matches.first {
        let range = match.rangeAtIndex(1)
        if let swiftRange = rangeFromNSRange(range, forString: input) {
            let name = input.substringWithRange(swiftRange)
        }
    }
} catch {
    // regex was bad!
}

最佳答案

如我的评论所述,您需要转义 {}。这导致以下正则表达式:mycard\\{(.*)\\}\\{(.*)\\}

然后您可能想要稍微更改匹配逻辑以输出预期结果:

if let match = matches.first {
    for i in 1..<match.numberOfRanges {
        let range = match.rangeAtIndex(i)
        if let swiftRange = rangeFromNSRange(range, forString: input) {
            let name = input.substringWithRange(swiftRange)
            print(name)
        }
    }
}

哪些输出

front
back

如果要匹配多张卡片,请使用以下正则表达式:

mycard\\{([^{]*)\\}\\{([^{]*)\\}

然后遍历匹配项

for match in matches {
    for i in 1..<match.numberOfRanges {
        let range = match.rangeAtIndex(i)
        if let swiftRange = rangeFromNSRange(range, forString: input) {
            let name = input.substringWithRange(swiftRange)
            print(name)
        }
    }
}

对于输入 mycard{front}{back} mycard{front1}{back1} 正确的输出是

front
back
front1
back1

关于regex - swift 2 NSRegularExpression,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34707262/

相关文章:

r - 如何提取多个下划线之间的数字

ios - 如何在 swift3 的 UICollectionView 中显示两个不同的单元格

ios - 如何运行导致框架运行时错误的 iOS 应用程序 "code signature invalid"

ios - 在iOS上卸载抵抗存储短字符串的地方?

javascript - 仅替换部分正则表达式匹配

php - 获取大括号之间出现的所有单词

C# 如何替换比匹配字符串更短的字符串?

Notepad++中的正则表达式以删除空行

Swift AWS Cognito 错误 : Authentication delegate not set

swift - SKSpriteNode 没有名为 '' 的成员 - 如何访问在我的生成方法中声明的变量?