如何在Swift 3中从字符串中获取前四个字符?

103
我正在尝试在Swift中进行IFSCCode验证,但我面临的问题是我无法获取字符串中的前四个字母。
IFSC代码示例:
ABCD0200000
IFSC代码外观如下:
1. IFSC代码的前四个字符始终是字母 2. 第五个字符始终是零。 3. 其余部分可以是任何内容 4. IFSC代码的长度不应大于或小于11。 它应该有11个字符长。
我已经用Objective C编写了ifs代码验证代码,但我对Swift不太熟悉,因此在复制相同代码时遇到了问题。
以下是我在Objective C中编写的代码:
- (BOOL)validateIFSCCode:(NSString*)ifsccode {
  if (ifsccode.length < 4) {
    return FALSE;
  }
  for (int i = 0; i < 4; i++) {
    if (![[NSCharacterSet letterCharacterSet]
            characterIsMember:[ifsccode characterAtIndex:i]]) {
      return FALSE;
    }
  }
  if (ifsccode.length < 10) {
    return FALSE;
  }
  if ([ifsccode characterAtIndex:4] != '0') {
    return FALSE;
  } else {
    return TRUE;
  }
}

在Swift 3中

func validateIfscCode(_ ifscCode : String) -> Bool{
    if(ifscCode.characters.count < 4){
        return false;
    }

    for( _ in 0 ..< 4){
        let charEntered = (ifscCode as NSString).character(at: i)
    }
    if(ifscCode.characters.count < 10){
        return false;
    }

    let idx = ifscCode[ifscCode.index(ifscCode.startIndex, offsetBy: 4)]

    print("idx:%d",idx)
    if (idx == "0"){
    }
    return true
}
4个回答

229

获取字符串前缀的最简单方法是使用

// Swift 3
String(string.characters.prefix(4))

// Swift 4 and up
string.prefix(4)

// Objective-C
NSString *firstFour = [string substringToIndex:4];

1
完美!谢谢。 - Vinestro
我得到了“无法将类型为'String.SubSequence'(又名'Substring')的值分配给类型'String?'”的错误。 - etayluz
14
如果您需要结果是一个字符串,则需要使用 String(string.prefix(4)) 将子字符串转换为常规字符串。 - Tim Vermeulen
超棒的解决方案 :) - steveSarsawa

78
这是一个使用正则表达式进行简单验证的例子。该模式表示:
  • ^必须是字符串的开头
  • [A-Za-z]{4} = 四个字符 A-Z 或 a-z
  • 0一个零
  • .{6}六个任意字符
  • $必须是字符串的结尾

更新至Swift 4

func validateIFSC(code : String) -> Bool {
  let regex = try! NSRegularExpression(pattern: "^[A-Za-z]{4}0.{6}$")
  return regex.numberOfMatches(in: code, range: NSRange(code.startIndex..., in: code)) == 1
}

或者更简单地使用Swift 5.7+中提供的本地Swift正则表达式。
func validateIFSC(code : String) -> Bool {
    return code.wholeMatch(of: /[A-Za-z]{4}0.{6}/) != nil
}

PS:回答你的问题,你可以在Swift 3中使用前4个字符。
let first4 = code.substring(to:code.index(code.startIndex, offsetBy: 4))

在Swift 4中只需这样
let first4 = String(code.prefix(4))

感谢 @vadian 提供的解决方案。 - Rani

20

Swift 5

string.prefix(4)  // Replace 4 with number of letters you want to get from the string

这在Xcode 10.2上正常运行。


8

获取所有子字符串的扩展

extension String {
   func first(char:Int) -> String {
        return String(self.prefix(char))
    }

    func last(char:Int) -> String
    {
        return String(self.suffix(char))
    }

    func excludingFirst(char:Int) -> String {
        return String(self.suffix(self.count - char))
    }

    func excludingLast(char:Int) -> String
    {
         return String(self.prefix(self.count - char))
    }
 }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接