• [Swift]字符串(String类、NSString类)常用操作


    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
    ➤微信公众号:山青咏芝(shanqingyongzhi)
    ➤博客园地址:山青咏芝(https://www.cnblogs.com/strengthen/ 
    ➤GitHub地址:https://github.com/strengthen/LeetCode
    ➤原文地址:https://www.cnblogs.com/strengthen/p/9879997.html 
    ➤如果链接不是山青咏芝的博客园地址,则可能是爬取作者的文章。
    ➤原文已修改更新!强烈建议点击原文地址阅读!支持作者!支持原创!
    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

    NS是Cocoa类对象类型的前缀,来源于乔布斯建立的另一家公司--NeXT
    NSString的使用方法,和Swift语言中的String有很多相似之处。

    1、字符串的定义
    String类

    var str1:String = "My name is strengthen"

    NSString类

    1 var nsStr1:NSString = "My name is strengthen"
    2 var nsStr2:NSString = NSString(string: "My name is strengthen")
    3 var nsStr3:NSString = NSString(string: str1)

    String类空字符串

     1 var strEmpty1:String = ""
     2 var strEmpty2:String = String()
     3 dump(strEmpty2)
     4 //Print - ""
     5 //判断是否为空
     6 //方式1
     7 print(strEmpty2.isEmpty)
     8 //Print true
     9 
    10 //方式2 
    11 print(strEmpty2.count == 0)
    12 //Print true
    13 
    14 //方式3 已初始化,不为nil
    15 print(strEmpty2 == nil)
    16 //Print false
    17 
    18 //方式4
    19 print(strEmpty2 is NSNull )
    20 //Print false

    NSString类空字符串

     1 var nsStrEmpty1:NSString = NSString(string: "") 
     2 var nsStrEmpty2:NSString = NSString(string: String())
     3 
     4 //方式1 区分大小写比较,用来判断是否为空
     5 let check = nsStrEmpty2.caseInsensitiveCompare("") == .orderedSame
     6 print(check)
     7 //Print true
     8 
     9 //方式2 已初始化,不为NSNull
    10 print(nsStrEmpty2 is NSNull )
    11 //Print false

    String 转换为 NSString,转换需要遵循严格的类型转化。

    var nsStr4: NSString = str1 as NSString

    NSString 转换为String,转换需要遵循严格的类型转化。

    var str2:String = nsStr2 as String 

    2、字符串格式化

    格式说明由“%”和格式字符组成,如%d%f等。它的作用是将输出的数据转换为指定的格式输出。

    %d 整型输出,%ld长整型输出;

    %o 以八进制数形式输出整数

    %x 以十六进制数形式输出整数,或输出字符串的地址;

    %u 以十进制数输出unsigned型数据(无符号数)。

    注意:%d与%u有无符号的数值范围,也就是极限的值,否则打印错误数值。

    %c 用来输出一个字符;

    %s 用来输出一个字符串;

    %f 用来输出实数,以小数形式输出,默认情况下保留小数点6位;

    %.10f 用来输出实数,保留小数点10位;

    %e 以指数形式输出实数;

    %g 根据大小自动选f格式或e格式,且不输出无意义的零。

    格式化:

    1 let nsStr = NSString(format: "%f", 66.666)
    2 let str =String(format: "%f", 66.666)

    拼接:

    1 var str1 = NSString(string: "hello")
    2 var str2 = str1.appending("strengthen")
    3 var str3 = str1 + "strengthen"

    格式化拼接:

    1 let x:Int = 1
    2 let y:Double = 0.56
    3 let sum:Double = Double(x) + y
    4 print(String(format: "%d + %.2f = (sum)", x, y))
    5 //Print 1 + 0.56 = 1.56

    3、字符定义

    Character转ASCII整数值:

     1 //Character扩展方法  
     2 extension Character  
     3 {  
     4   //转ASCII整数值(定义小写为整数值)
     5    var ascii: Int {
     6        get {
     7            return Int(self.unicodeScalars.first!.value)
     8        }       
     9     }    
    10 }

    ASCII整数值转Character:

    1 //Int扩展方法  
    2 extension Int
    3 {
    4     //属性:ASCII值(定义大写为字符值)
    5     var ASCII:Character 
    6     {
    7         get {return Character(UnicodeScalar(self)!)}
    8     }
    9 }

    CharacterSet 各个枚举类型的含义:

    .controlCharacters:控制符

    .whitespaces:空格

    .newlines:换行符

    .whitespacesAndNewlines:空格换行

    .decimalDigits:小数

    .letters:文字

    .lowercaseLetters:小写字母

    .uppercaseLetters:大写字母

    .nonBaseCharacters:非基础

    .alphanumerics:字母数字

    .decomposables:可分解

    .illegalCharacters:非法

    .punctuationCharacters:标点

    .capitalizedLetters:大写

    .symbols:符号

    4、字符串拼接

     1 var str1 = "My name is "
     2 var str2 = "strengthen"
     3 
     4 //方式1
     5 var strConnect1 = str1 + str2
     6 
     7 //方式2
     8 var strConnect2 = "(str1)(str2)"
     9 
    10 //方式3
    11 var str3:NSString = NSString(string: "My name is ")
    12 var strConnect3 = str3.appending("strengthen")
    13 
    14 //方式4 字符数组转字符串
    15 let arrayStr = ["s","t","r","e","n","g","t","h","e","n","!"]
    16 //方式4.1
    17 let str1 = arrayStr.joined(separator: "")
    18 let str2 = arrayStr.joined(separator: "-")
    19 print("(str1) ", terminator: "")
    20 print("(str2) ", terminator: "")
    21 //strengthen! 
    22 //s-t-r-e-n-g-t-h-e-n-!
    23 
    24 //方式4.2:注意与方式4.1比较,方式4.2只在首位添加"-"
    25 let str3 = arrayStr.reduce("", {$0 + $1})
    26 let str4 = arrayStr.reduce("-", {$0 + $1})
    27 print("(str3) ", terminator: "")
    28 print("(str4) ", terminator: "")
    29 //strengthen!
    30 //-strengthen!
    31 
    32 //方式5:整数数组转字符串
    33 let arrayInt = [0,1,2,3,4,5,6,7,8,9]
    34 let dataInt = arrayInt.map(String.init)
    35 let strInt = dataInt.joined(separator: "-")
    36 print("(strInt) ", terminator: "")
    37 //0-1-2-3-4-5-6-7-8-9

    5、获取字符串中指定索引处的字符

    每个String值都有一个关联的索引类型,String.Index它对应Character于字符串中每个值的位置。

    不同的字符可能需要不同的内存量来存储,因此为了确定哪个Character位于特定位置,您必须从开头或结尾迭代每个Unicode标量String。

    因此,Swift字符串不能用整数值索引。可以使用index(before:)和index(after:)方法访问给定索引之前和之后的索引String。

    要访问远离给定索引的索引,可以使用该index(_:offsetBy:)方法而不是多次调用其中一种方法。

     1 let str = "Strengthen"
     2 
     3 print(str[str.startIndex])
     4 //Print S
     5 print(str[str.index(before: str.endIndex)])
     6 //Print n
     7 
     8 let index = str.index(str.startIndex, offsetBy: 0)
     9 print(str[index])
    10 //Print S
    11 
    12 //endIndex属性是a中最后一个字符后的位置String。
    13 //因此endIndex属性不是字符串下标的有效参数。
    14 str[str.endIndex]
    15 // Error
    16 
    17 str[str.index(after: str.endIndex)]
    18 // Error

    扩展String类

     1 //String扩展
     2 extension String {        
     3     //subscript函数可以检索数组中的值
     4     //直接按照索引方式截取指定索引的字符
     5     subscript (_ i: Int) -> Character {
     6         //读取字符
     7         get {return self[index(startIndex, offsetBy: i)]}
     8         
     9         //修改字符
    10         set
    11         {
    12             if newValue is Character
    13             {
    14                 //转换为字符数组
    15                 var arr:[Character] = Array(self) 
    16                 arr[i] = newValue
    17                 self = String(arr)
    18             }        
    19         }
    20     }
    21 }

    6、字符串插入

    var str = "Strengthen"

    若要将单个字符插入到指定索引处的字符串中,请使用该insert(_:at:)方法

    1 str.insert("!", at: str.endIndex)
    2 print(str)
    3 //Print Strengthen!

    指定索引处插入另一个字符串的内容,请使用该insert(contentsOf:at:)方法。

    1 str.insert(contentsOf: " hello", at: str.index(before: str.endIndex))
    2 print(str)
    3 //Print Strengthe hellon

    7、字符串删除

    var str = "Strengthen"

    要从指定索引处的字符串中删除单个字符,请使用remove(at:)方法

    1 str.remove(at: str.index(before: str.endIndex))
    2 print(str)
    3 //Print Strengthe

    删除指定范围内的子字符串,请使用removeSubrange(_:)方法
    注意下方代码从后往前用负数的方式

    1 let range = str.index(str.endIndex, offsetBy: -5)..<str.endIndex
    2 str.removeSubrange(range)
    3 print(str)
    4 //Print Stren

    注意(总结6、字符串插入和7、字符串删除):

    使用insert(_:at:),insert(contentsOf:at:),remove(at:),和removeSubrange(_:),对符合任何类型的方法RangeReplaceableCollection的协议。

    这包括String以及集合类型,如Array,Dictionary和Set。

    8、获取字符串长度

    1 var str = "Strengthen"
    2 print(str.count)
    3 //Print 10

    9、字符串比较
    Swift提供了三种比较文本值的方法:字符串和字符相等,前缀相等和后缀相等。

    注意:Swift中的字符串和字符比较不是区域设置敏感的。

     1 let str1="hello,"
     2 let str2="strengthen"
     3 let str3="hello,strengthen"
     4 
     5 let compare1 = str1==str2 
     6 //false
     7 
     8 let compare2 = str1+str2 == str3
     9 //true
    10 
    11 let compare3 = str1 < str2 
    12 //true
    13 
    14 let compare4 = str1 != str2 
    15 //true

    字符串比较的方法:isEqual

    1 let str = "Hello World!"
    2 print(str.isEqual("Hello World!"))
    3 //true

    10、检查字字符串前缀
    检查字符串是否具有特定的字符串前缀调用字符串hasPrefix(_:),其采用类型的单个参数String并返回布尔值

     1 let romeoAndJuliet = [
     2     "Act 1 Scene 1: Verona, A public place",
     3     "Act 1 Scene 2: Capulet's mansion",
     4     "Act 1 Scene 3: A room in Capulet's mansion",
     5     "Act 1 Scene 4: A street outside Capulet's mansion",
     6     "Act 1 Scene 5: The Great Hall in Capulet's mansion",
     7     "Act 2 Scene 1: Outside Capulet's mansion",
     8     "Act 2 Scene 2: Capulet's orchard",
     9     "Act 2 Scene 3: Outside Friar Lawrence's cell",
    10     "Act 2 Scene 4: A street in Verona",
    11     "Act 2 Scene 5: Capulet's mansion",
    12     "Act 2 Scene 6: Friar Lawrence's cell"
    13 ]

    hasPrefix(_:)方法与romeoAndJuliet数组一起使用来计算播放的第1幕中的场景数量:

    1 var act1SceneCount = 0
    2 for scene in romeoAndJuliet {
    3     if scene.hasPrefix("Act 1 ") {
    4         act1SceneCount += 1
    5     }
    6 }
    7 print("There are (act1SceneCount) scenes in Act 1")
    8 // Prints "There are 5 scenes in Act 1"

    11、检查字符串后缀
    检查字符串是否具有特定的字符串后缀调用字符串hasSuffix(_:),其用类型的单个参数String并返回布尔值

     1 let romeoAndJuliet = [
     2     "Act 1 Scene 1: Verona, A public place",
     3     "Act 1 Scene 2: Capulet's mansion",
     4     "Act 1 Scene 3: A room in Capulet's mansion",
     5     "Act 1 Scene 4: A street outside Capulet's mansion",
     6     "Act 1 Scene 5: The Great Hall in Capulet's mansion",
     7     "Act 2 Scene 1: Outside Capulet's mansion",
     8     "Act 2 Scene 2: Capulet's orchard",
     9     "Act 2 Scene 3: Outside Friar Lawrence's cell",
    10     "Act 2 Scene 4: A street in Verona",
    11     "Act 2 Scene 5: Capulet's mansion",
    12     "Act 2 Scene 6: Friar Lawrence's cell"
    13 ]

    使用该hasSuffix(_:)方法计算在Capulet的mansion和Friar Lawrence的单元格内或周围发生的场景数量:

     1 var mansionCount = 0
     2 var cellCount = 0
     3 for scene in romeoAndJuliet {
     4     if scene.hasSuffix("Capulet's mansion") {
     5         mansionCount += 1
     6     } else if scene.hasSuffix("Friar Lawrence's cell") {
     7         cellCount += 1
     8     }
     9 }
    10 print("(mansionCount) mansion scenes; (cellCount) cell scenes")
    11 // Prints "6 mansion scenes; 2 cell scenes"    

    12、字符串包含

    1 let str = "strengthen";
    2 let exist1 = (str as NSString).contains("stren")
    3 let exist2 = str.contains("stren")
    4 print(exist1)
    5 print(exist2)
    6 //Print true

    13、查找字符

    1 let str = "strengthen"
    2 print(str.index(of: "r")?.encodedOffset)
    3 //Print Optional(2)
    4 print(str.index(of: "z")?.encodedOffset)
    5 //Print nil

    14、截取字符串
    字符串和子字符串之间的区别在于,作为性能优化,子字符串可以重用用于存储原始字符串的部分内存,或者用于存储另一个子字符串的内存的一部分。

    1 let greeting = "Hello, world!"
    2 let index = greeting.firstIndex(of: ",") ?? greeting.endIndex
    3 let beginning = greeting[..<index]
    4 // beginning is "Hello"
    5 
    6 // Convert the result to a String for long-term storage.
    7 let newString = String(beginning)

    15、Trim字符串:trimmingCharacters
    (1)、删除前后多余的空格

    1 //原始字符串
    2 let str1 = " strengthen "
    3 //除去前后空格
    4 let str2 = str1.trimmingCharacters(in: .whitespaces)
    5 print(str2)
    6 //Print strengthen

    (2)、删除前后指定的字符

    1 //原始字符串
    2 let str3 = "((strengthen))"
    3 //删除前后()
    4 let characterSet = CharacterSet(charactersIn: "()")
    5 let str4 = str1.trimmingCharacters(in: characterSet)
    6 print(str4)
    7 //Print strengthen

    16、字符串分割

     1 let str = "s、t、r、e、n、g、t、h、e、n"
     2 //方法1:使用components(separatedBy:" ")方法
     3 //字符串转数组
     4 let array1 = str.components(separatedBy:"")
     5 print("(array1) ", terminator: "")
     6 //Print ["s", "t", "r", "e", "n", "g", "t", "h", "e", "n"] 
     7 
     8 //方法2:使用characters.split()方法
     9 let str = "s、t、r、e、n、g、t、h、e、n"
    10 print("原始字符串:(str)")
    11 //Print 原始字符串:s、t、r、e、n、g、t、h、e、n
    12 let splitedArray = str.characters.split{$0 == ""}.map(String.init)
    13 print("拆分后的数组:(splitedArray)")
    14 //Print 拆分后的数组:["s", "t", "r", "e", "n", "g", "t", "h", "e", "n"]

    字符串转字符数组:

    1 let str = "I am Strengthen"
    2 let array2 = str.components(separatedBy:" ")
    3 print("(array2) ", terminator: "")
    4 //["I", "am", "Strengthen"]

    字符数组转字符串:

     1 let arrayStr = ["s","t","r","e","n","g","t","h","e","n","!"]
     2 
     3 //方式1
     4 let str1 = arrayStr.joined(separator: "")
     5 let str2 = arrayStr.joined(separator: "-")
     6 print("(str1) ", terminator: "")
     7 print("(str2) ", terminator: "")
     8 //strengthen! 
     9 //s-t-r-e-n-g-t-h-e-n-!
    10 
    11 //方式2:注意与方式1比较,方式2只在首位添加"-"
    12 let str3 = arrayStr.reduce("", {$0 + $1})
    13 let str4 = arrayStr.reduce("-", {$0 + $1})
    14 print("(str3) ", terminator: "")
    15 print("(str4) ", terminator: "")
    16 //strengthen!
    17 //-strengthen!
    18 
    19 /*整数数组转字符串*/
    20 let arrayInt = [0,1,2,3,4,5,6,7,8,9]
    21 let dataInt = arrayInt.map(String.init)
    22 let strInt = dataInt.joined(separator: "-")
    23 print("(strInt) ", terminator: "")
    24 //0-1-2-3-4-5-6-7-8-9

    17、字符串替换replacingOccurrences
    (1)、简单替换

    1 //原始字符串
    2 let str1 = "strengthen"
    3 //替换后的字符串
    4 let str2 = str1.replacingOccurrences(of: "en", with: "ne")
    5 print(str2)
    6 //Print strnegthne

    (2)、使用正则表达式替换

     1 extension String {
     2     //使用正则表达式替换
     3     func pregReplace(pattern: String, with: String,options: NSRegularExpression.Options = []) -> String {
     4         let regex = try! NSRegularExpression(pattern: pattern, options: options)
     5         return regex.stringByReplacingMatches(in: self, 
     6                                          options: [],
     7                                            range:NSMakeRange(0, self.count),
     8                                     withTemplate: with)
     9     }
    10 }

    18、string转换为Int/Long/Float/Double/Bool等

     1 var str1="100"
     2 var num1=(str1 as NSString).integerValue
     3 print(num1)
     4 //Print 100
     5 var num2=(str1 as NSString).intValue
     6 print(num2)
     7 //Print 100
     8 var num3=(str1 as NSString).longLongValue
     9 print(num3)
    10 //Print 100
    11 var str2="10.8888888"
    12 var num4=(str2 as NSString).floatValue
    13 print(num4)
    14 //Print 10.888889
    15 var num5=(str2 as NSString).doubleValue
    16 print(num5)
    17 //Print 10.8888888
    18 var str3="true"
    19 var num6=(str3 as NSString).boolValue
    20 print(num6)
    21 //Print true

    19、反转字符串

     1 var str = "strengthen"
     2 //不修改原字符串
     3 str.reversed()
     4 print(str)
     5 //Print strengthen
     6 
     7 //注意转换为字符串
     8 //str.reversed()为ReversedCollection<String>(_base: "strengthen")
     9 print(String(str.reversed()))
    10 //Print nehtgnerts

    20、字符串遍历,枚举字符
    请参考本博客另一篇技术博文:《[Swift]遍历字符串》


    21、首字母大写、转换为大写字母、转换为小写字母
    请参考本博客另一篇技术博文:《[Swift]字符串大小写转换,同时实现本地化或设置语言环境》


    22、使用NSString对字符串进行各种操作
    请参考本博客另一篇技术博文:[Swift5.2实际操作]七、常见概念-(5)使用NSString对字符串进行各种操作

    23、添加指定个数的字符

    字符串本身就是字符的数组,所以可以利用数组的定义形式去定义字符串。

    1 var str:String = String()
    2 str.append(String(repeating:"S",count:10))
    3 print(str)
    4 //Print SSSSSSSSSS
  • 相关阅读:
    转载: SQLyog连接MySQL8 异常2059Authentication plugin 'caching_sha2_password' cannot be loaded解决方案
    linux 运维知识主页
    解决Xshell连接远程linux服务器,关闭Xshell程序对应的运行程序也相
    WPF布局控件
    WPF属性
    AutoMapper 四啥注意
    引用类型和值类型
    蠢鸟之xamarin.forms下面加载字体之二
    一头好奇的猫(庆军)之AES ECB模式C#要跟JAVA一致的话需要注意的
    加班
  • 原文地址:https://www.cnblogs.com/strengthen/p/9879997.html
Copyright © 2020-2023  润新知