打比方说我想针对 strContent 这个 String 的内容进行操作。该 String 内容如下
危机 0 ㄨㄟˊ ㄐㄧ
除夕 102 ㄔㄨˊ ㄒㄧˋ
圳沟 0 ㄗㄨㄣˋ ㄍㄡ
细菌 12 ㄒㄧˋ ㄐㄩㄣˋ
Regex A: ^.*危.*\b(ㄨㄟˊ)\b.*$
(因为内容格式的原因,才仅对注音使用 whole-word 标记。)
当且仅当对 Regex A 批配到的结果执行行内替换操作 Regex B:查找 \b(ㄨㄟˊ)\b
替换成 ㄨㄟ
。(「危」的陆规审音是「ㄨㄟ」,注音文第一声不用写调号。)
同样,Regex B 将除夕的第四声改成第一声的时候,不应该影响到「细菌」的「细」。
然而我用 StackOverflow 找到的方法好像并不是很好用,至少目前无法完成匹配:
#!/usr/bin/env swift
import Foundation
extension String {
/* https://stackoverflow.com/a/66189289/4162914 */
func match(_ pattern: String) -> [String] {
do {
let regex = try NSRegularExpression(pattern: pattern, options: NSRegularExpression.Options(rawValue: 0))
let nsstr = self as NSString
let all = NSRange(location: 0, length: nsstr.length)
var matches : [String] = [String]()
regex.enumerateMatches(in: self, options: [], range: all) {
(result : NSTextCheckingResult?, _, _) in
if let r = result {
let result = nsstr.substring(with: r.range) as String
matches.append(result)
}
}
return matches
} catch {
return [String]()
}
}
}
func filterTone_Romaji(inputString: String) -> [String] {
var arrResult = inputString.match("^.*危.*\\b(ㄨㄟˊ)\\b.*$")
arrResult.append(contentsOf: inputString.match("^.*圳.*\\b(ㄗㄨㄣˋ)\\b.*$"))
return arrResult
}
let str_Test_File = "危机 0 ㄨㄟˊ ㄐㄧ\n圳沟 0 ㄗㄨㄣˋ ㄍㄡ"
// Trying to find the matched result
var arrConvResultTest : [[String]] = [[]]
arrConvResultTest.append(["@# phrases-test-pragma-header.txt"])
var arrConv_Test_File = filterTone_Romaji(inputString: str_Test_File)
// Print Out the matched result
var varLineData = ""
for lineData in arrConvResultTest {
varLineData = lineData.joined()
print(varLineData)
}
我该怎样做才能让匹配生效呢?
P.S.: 论及行内查找替换,可以用这个函数:
extension String {
/* https://stackoverflow.com/a/40993403/4162914 */
mutating func regReplace(pattern: String, replaceWith: String = "") {
do {
let regex = try NSRegularExpression(pattern: pattern, options: .caseInsensitive)
let range = NSRange(location: 0, length: count)
self = regex.stringByReplacingMatches(in: self, options: [], range: range, withTemplate: replaceWith)
} catch { return }
}
}
Incorrect results may be the cause of incorrect regular expression writing;
"\b(ㄨㄟˊ)\b" will match "(ㄨㄟˊ)" not "ㄨㄟˊ"
可能是正则表达式书写不正确导致的错误;"\b(ㄨㄟˊ)\b" 匹配的是 "(ㄨㄟˊ)" 而不是 "ㄨㄟˊ"