我有一个字符串,例如:
NSString *str = @"Strängnäs"
然后我使用一种方法将斯堪的纳维亚字母替换为*
,因此它将是:
NSString *strReplaced = @"Str*ngn*s"
我需要一个函数来匹配str
与strReplaced
.换句话说,*
应被视为任何字符(*
应与任何字符匹配)。
我怎样才能做到这一点?
Strängnäs should be equal to Str*ngn*s
编辑:
也许我不够清楚。我希望*
被视为任何角色。因此,在执行[@"Strängnäs" isEqualToString:@"Str*ngn*s"]
时,它应该返回YES
我认为以下正则表达式模式将匹配所有非 ASCII 文本,考虑到斯堪的纳维亚字母不是 ASCII:
[^ -~]
分别处理每行以避免匹配换行符,并将匹配项替换为 *。
演示:https://regex101.com/r/dI6zN5/1
编辑:
下面是基于上述模式的优化模式:
[^ 00-~]
演示:https://regex101.com/r/lO0bE9/1
编辑 1:根据您的评论,您需要一个 UDF(用户定义函数):
- 采用斯堪的纳维亚字符串
- 将其所有斯堪的纳维亚字母转换为 *
- 带星号的字符串
- 比较两个字符串
- 如果两个字符串匹配,则返回
True
,否则为 false。
然后,您可以像CompareString(ScanStr,AsteriskStr)
一样使用 UDF。
我使用 JLILI Amen 发布的正则表达式创建了一个代码示例
法典
NSString *string = @"Strängnäs";
NSError *error = nil;
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"[^ -~]" options:NSRegularExpressionCaseInsensitive error:&error];
NSString *modifiedString = [regex stringByReplacingMatchesInString:string options:0 range:NSMakeRange(0, [string length]) withTemplate:@"*"];
NSLog(@"%@", modifiedString);
输出
Str*ngn*s
不确定你到底在追求什么,但也许这会有所帮助。
匹配任何内容的正则表达式模式是 .
(点),因此您可以通过将 *
替换为 .
来从strReplaced
创建模式:
NSString *pattern = [strReplaced stringByReplacingOccurencesOfString:@"*" withString:"."];
现在使用 NSRegularExpression
,您可以从pattern
构造一个正则表达式,然后查看str
是否匹配它 - 请参阅所需方法的文档。