如何获取Swift中某些字符前后的部分字符串?[已关闭]

to94eoyn  于 2023-01-25  发布在  Swift
关注(0)|答案(2)|浏览(128)

已关闭。此问题需要超过focused。当前不接受答案。
**想要改进此问题吗?**更新此问题,使其仅关注editing this post的一个问题。

2天前关闭。
Improve this question
我知道还有其他类似的问题,但是它们要么和数组有关,要么和字符串的大小写不同有关,假设我有一个字符串"AABBCCDDEEFF",我怎么才能得到BB之后和EE之前的所有内容,从而得到CCDD的输出呢?

xqk2d5yq

xqk2d5yq1#

有许多regex选项:
1.在iOS 16及更高版本(或macOS 13及更高版本)中:

let string = "AABBCCDDEEFF"

guard let result = string.firstMatch(of: /BB(.*)EE/)?.1 else { return }
print(result)

1.此外,在iOS 16及更高版本中,如果您不习惯使用regex,可以使用RegexBuilder

import RegexBuilder

let regex = Regex {
    "BB"
    Capture { ZeroOrMore { CharacterClass.any } }
    "EE"
}
guard let result = string.firstMatch(of: regex)?.1 else { return }
print(result)

1.在旧版本的操作系统中,您可以使用各种传统的正则表达式方法。例如,您可以查找具有look-behind和look-aheadAssert的正则表达式:

guard let range = string.range(of: "(?<=BB).*(?=EE)", options: .regularExpression) else { return }
print(string[range])

1.或者,一种更老的技术是NSRegularExpression,可能是一个简单的捕获组:

let regex = try! NSRegularExpression(pattern: "BB(.*)EE")
guard
    let match = regex.firstMatch(in: string, range: NSRange(location: 0, length: string.utf16.count)),
    let range = Range(match.range(at: 1), in: string)
else { return }
print(string[range])

对于前两个选项,您可以参考WWDC 2022视频Meet Swift RegexSwift Regex: Beyond the basics

exdqitrt

exdqitrt2#

字符串有一个名为localizedStandardRange的方法,它是一个区分音调符号和大小写的方法。你可以得到第一个匹配项的范围上限,然后搜索该索引之后的子字符串,寻找第二个匹配项。如果找到了,你只需要检查索引是否不相等,这意味着结果将是一个空字符串:

let string = "AABBCCDDEEFF"

if let start = string.localizedStandardRange(of: "Bb")?.upperBound,
   let end = string[start...].localizedStandardRange(of: "eE")?.lowerBound,
    start != end {
    let substring = string[start..<end]
    print(substring)   //  "CCDD\n"
}

相关问题