我尝试使用正则表达式来替换字符串中所有出现的英国汽车注册。
当字符串与正则表达式完全匹配时,下面的swift代码可以完美地工作。
var myString = "DD11 AAA"
var stringlength = countElements(myString)
var ierror: NSError?
var regex:NSRegularExpression = NSRegularExpression(pattern: "^([A-HK-PRSVWY][A-HJ-PR-Y])\\s?([0][2-9]|[1-9][0-9])\\s?[A-HJ-PR-Z]{3}$", options: NSRegularExpressionOptions.CaseInsensitive, error: &ierror)!
var modString = regex.stringByReplacingMatchesInString(myString, options: nil, range: NSMakeRange(0, stringlength), withTemplate: "XX")
print(modString)
结果为XX
但是,以下操作不起作用,字符串不会被修改
var myString = "my car reg 1 - DD11 AAA my car reg 2 - AA22 BBB"
var stringlength = countElements(myString)
var ierror: NSError?
var regex:NSRegularExpression = NSRegularExpression(pattern: "^([A-HK-PRSVWY][A-HJ-PR-Y])\\s?([0][2-9]|[1-9][0-9])\\s?[A-HJ-PR-Z]{3}$", options: NSRegularExpressionOptions.CaseInsensitive, error: &ierror)!
var modString = regex.stringByReplacingMatchesInString(myString, options: nil, range: NSMakeRange(0, stringlength), withTemplate: "XX")
print(modString)
结果为my car reg 1 - DD11 AAA my car reg 2 - AA22 BBB
有人能给予我指点吗?
9条答案
按热度按时间rks48beu1#
您需要删除
^
和$
锚。^
表示 * 字符串的开始 *,$
表示 * 字符串的结束 *(或行,取决于选项)。这就是为什么你的第一个例子工作:在第一个测试字符串中,字符串的开头实际上跟随着您的模式,并以它结束。在第二个测试字符串中,在字符串的中间发现了模式,因此
^...
不能应用。如果您只删除^
,则$
将应用于注册号的第二次出现,输出将为my car reg 1 - DD11 AAA my car reg 2 - XX
。6ss1mwsb2#
让我们使用一个类扩展来用Swift 3语法 Package 它:
结果为
7777777777
(从而从电话号码中删除国家代码)mm5n2pyu3#
Swift 4.2更新
qnakjoqk4#
Swift 2.1更新:
nwnhqdif5#
警告
不要像上面引用的所有例子那样使用
NSRange(location: 0, length: myString.count)
。使用
NSRange(myString.startIndex..., in: myString)
代替!.count
将把\r\n
这样的换行符算作一个字符-这可能会导致缩短的,因此无效的,不匹配整个字符串的NSRange。(.length should work)
uyto3xhc6#
简单扩展:
对其他答案的优势
error
range
*BUG *rqqzpn5f7#
使用
pattern: "^ ... $"
,您已经指定了模式锚定到字符串的开始和结束,换句话说,* 整个 * 字符串必须匹配模式。只需从模式中删除^
和$
,您将获得预期的结果。t9aqgxwy8#
所有在答案中使用
.count
的答案的注意事项:在操作目标范围具有代理配对字符的情况下,这将导致问题。
请使用
.utf16.count
修改您的答案。下面是瑞安·布罗迪的回答。使用Swift 5.5。
**更新:**如果考虑@coyer的担忧:
**还:**致@Martin R':只要你在正则表达式选项中启用了“.anchorsMatchLines”,就可以在正则表达式中使用^和$。我已经在上面的代码块中应用了这个选项。
olqngx599#
Swift 5.7更新