iOS - NSString 正则表达式匹配



我有一个字符串,例如:

NSString *str = @"Strängnäs"

然后我使用一种方法将斯堪的纳维亚字母替换为*,因此它将是:

NSString *strReplaced = @"Str*ngn*s"

我需要一个函数来匹配strstrReplaced.换句话说,*应被视为任何字符(*应与任何字符匹配)。

我怎样才能做到这一点?

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是否匹配它 - 请参阅所需方法的文档。

最新更新