【问题标题】:NSString: Find parts of string in another stringNSString:在另一个字符串中查找字符串的一部分
【发布时间】:2011-09-20 17:22:25
【问题描述】:

我知道如何在另一个字符串中找到一个字符串,这很容易。但在这种情况下,我想在 allProfessors 字符串中找到 John Smith。所以我想我可以拆分字符串并搜索这两个部分,这可以按我的意愿工作:

NSString *fullName = @"John Smith";
NSArray *parts = [fullName componentsSeparatedByString:@" "];
NSString *allProfessors = @"Smith, John; Clinton, Bill; Johnson, John";
NSRange range = [[allProfessors lowercaseString] rangeOfString:[[parts objectAtIndex:0] lowercaseString]];
NSRange range2 = [[allProfessors lowercaseString] rangeOfString:[[parts objectAtIndex:1] lowercaseString]];
if(range.location != NSNotFound && range2.location != NSNotFound) {
    NSLog(@"Found");
} else {
    NSLog(@"Not Found");
}

我想知道的是,这是执行此操作的最佳方法还是有更首选的方法来执行我想要的操作?

除此之外,如果我的fullName比我的allProfessors名字长怎么办,比如:

NSString *fullName = @"Gregory Smith";
NSString *allProfessors = @"Smith, Greg; Clinton, Bill; Johnson, John";

我仍然希望 Greg Smith 和 Gregory Smith 有一场比赛。

【问题讨论】:

  • 在什么方面最好?表现?可维护性?
  • 如果 allProfessors 是 NSArray 而不是 NSString 会更容易。然后你可以转置 fullName 并通过数组搜索。
  • 就速度而言,只是以正确的方式做事。

标签: objective-c ios nsstring


【解决方案1】:

您可以使用我更喜欢使用的正则表达式。见RegexKitLite

使用 RegexKitLite,您可以使用正则表达式 like(未经测试):

NSString *regEx = @"(?i)Smith,\\s*\\w";
NSArray *matchingStrings = [allProfessors componentsMatchedByRegex:regEx];

if ([matchingStrings count] == 0)  // not found!
{
   [...]
}
else
{
   [...]
}

使用 RegexKitLite,您也可以使用 [NSString stringByMatching:(NSString*)]。

你真的可以用正则表达式做很多事情。 Using RegexKitLite 提供了大量不同的功能。上面的正则表达式应该找到姓氏为 Smith 的人。

正则表达式解释:

  • (?i) 不区分大小写
  • Smith 匹配 Smith 的姓氏。显然,您可以将其更改为任何内容
  • , 匹配一个逗号
  • \\s* 匹配任意数量的空格(贪心)
  • \\w匹配一个单词

另外,您可以使用[NSString rangeOfString:options:] 函数,例如:

if ([myString rangeOfString:@"John" options:NSCaseInsensitiveSearch].location != NSNotFound &&
    [myString rangeOfString:@"Smith" options:NSCaseInsensitiveSearch].location != NSNotFound)
{
   NSLog(@"Found");
}
else
{
   NSLog(@"Not Found");
}

还可以查看[rangeOfString:options:range:locale:] 等类似功能,以便您可以进行不区分大小写的搜索,甚至可以指定区域设置。

【讨论】:

  • 我不确定这就是你要找的东西。如果没有,也许我应该问和你一样的问题! :) 无论如何,希望这对您有所帮助并提供一些新信息。如果这没有用,请给我留言,我会删除它。然而,正则表达式确实很棒。他们很好地解决了“模式匹配”的困境,但如果你只是想看看一个字符串是否包含另一个字符串,这可能是矫枉过正。我们使用 NSString rangeOfString:options: where I work.
  • 你为“Bill Smith”返回什么?
  • @ott +1 我真的应该让我的解决方案更灵活。
  • 山姆,我刚刚更新了我的问题。你能看看我刚刚添加的最后一部分,如果你认为正则表达式在这种情况下会有所帮助,请告诉我?
  • 如果你想根据某人是否有姓氏进行匹配,那么正则表达式会很好用。
猜你喜欢
  • 1970-01-01
  • 2022-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-22
  • 2014-01-25
  • 1970-01-01
  • 2018-10-03
相关资源
最近更新 更多