【问题标题】:Getting a empty Range<String.Index> in Swift在 Swift 中获取一个空的 Range<String.Index>
【发布时间】:2020-06-03 12:36:33
【问题描述】:

我对 Swift 很陌生,一直在尝试使用正则表达式,但是从字符串中获取匹配项似乎是一项不可逾越的任务。

这是我目前的做法。

print(data.substring(with: (data.range(of: "[a-zA-Z]at", options: .regularExpression))))

这不起作用,因为

Value of optional type 'Range&lt;String.Index&gt;?' must be unwrapped to a value of type 'Range&lt;String.Index&gt;'

我想这可能与它可能为空有关,所以现在我想为它提供一个使用 ?? 的替代方法。运算符。

print(data.substring(with: (data.range(of: "[a-zA-Z]at", options: .regularExpression) ?? Range&lt;String.Index&gt;())))

我想做的是为它提供一个空范围对象,但似乎不可能创建所需类型的空对象。

有什么建议吗?

【问题讨论】:

    标签: swift range


    【解决方案1】:

    Range&lt;String.Index&gt; 根本没有无参数初始化器。

    创建String.Index 的空范围的一种方法是使用:

    data.startIndex..<data.startIndex
    

    记住你不应该在这里使用整数,因为我们正在处理一个字符串的索引。如果您不明白原因,请参阅this

    所以:

    print(data.substring(with: (data.range(of: "[a-zA-Z]at", options: .regularExpression) ?? data.startIndex..<data.startIndex)))
    

    substring(with:) 已被弃用。推荐使用下标:

    print(data[data.range(of: "[a-zA-Z]at", options: .regularExpression) ?? data.startIndex..<data.startIndex])
    

    【讨论】:

      【解决方案2】:

      我建议不要创建一个空范围,而是创建一个空的Substring,以防不匹配。 Range 很容易出错,所以使用这种方法可以省去很多麻烦。

      let match: Substring
      if let range = data.range(of: "[a-zA-Z]at", options: .regularExpression) {
          match = data[range]
      } else {
          match = ""
      }
      print(match)
      

      【讨论】:

        【解决方案3】:

        您可以使用 Range 类型的简单扩展来创建此类构造函数。像这样:

        extension Range where Bound == String.Index {
            static var empty: Range<Bound> {
                "".startIndex..<"".startIndex
            }
        
            init() {
                self = Range<Bound>.empty
            }
        }
        

        那么就可以这样使用了:

        let str = "kukukukuku"
        let substr1 = str[str.range(of: "abc", options: .regularExpression) ?? Range<String.Index>()]
        let substr2 = str[str.range(of: "abc", options: .regularExpression) ?? Range<String.Index>.empty]
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-09-28
          • 1970-01-01
          • 1970-01-01
          • 2017-01-24
          • 2018-11-15
          • 2017-02-02
          • 2017-03-01
          • 1970-01-01
          相关资源
          最近更新 更多