iOS - NSString 正则表达式匹配

iOS - NSString regex match

我有一个字符串,例如:

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"] 它应该 return YES

考虑到斯堪的纳维亚字母不是 ASCII,我认为以下正则表达式模式将匹配所有非 ASCII 文本:

[^ -~]

分别处理每一行以避免匹配换行符并将匹配替换为 *.

演示:https://regex101.com/r/dI6zN5/1

编辑:

下面是基于上述模式的优化模式:

[^[=10=]0-~]

演示:https://regex101.com/r/lO0bE9/1

编辑 1: 根据您的评论,您需要一个 UDF(用户定义函数):

  • 采用斯堪的纳维亚字符串
  • 将其所有斯堪的纳维亚字母转换为 *
  • 接受带星号的字符串
  • 比较两个字符串
  • return True 如果两个字符串匹配,否则为假。

然后您可以像 CompareString(ScanStr,AsteriskStr) 一样使用 UDF。

不确定您到底在寻找什么,但这也许会有所帮助。

匹配任何内容的正则表达式模式是.(点),因此您可以通过将*替换为[=11=来从strReplaced创建一个模式]的:

NSString *pattern = [strReplaced stringByReplacingOccurencesOfString:@"*" withString:"."];

现在使用 NSRegularExpression,您可以从 pattern 构造一个正则表达式,然后查看 str 是否匹配它 - 请参阅 documentation 了解所需的方法。

我使用 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