如何在具有可变宽度 Unicode 字符的 Swift 字符串上使用 NSRegularExpression?

2024-01-18

我无法获取NSRegularExpression匹配字符串中含有较宽 (?) Unicode 字符的模式。看起来问题出在范围参数上——Swift 计算单个 Unicode 字符,而 Objective-C 将字符串视为由 UTF-16 代码单元组成。

这是我的测试字符串和两个正则表达式:

let str = "dog????????cow"
let dogRegex = NSRegularExpression(pattern: "d.g", options: nil, error: nil)!
let cowRegex = NSRegularExpression(pattern: "c.w", options: nil, error: nil)!

我可以毫无问题地匹配第一个正则表达式:

let dogMatch = dogRegex.firstMatchInString(str, options: nil, 
                   range: NSRange(location: 0, length: countElements(str)))
println(dogMatch?.range)  // (0, 3)

但第二个使用相同的参数失败,因为我发送它的范围(0...7)不够长,无法覆盖整个字符串NSRegularExpression被关注到:

let cowMatch = cowRegex.firstMatchInString(str, options: nil, 
                   range: NSRange(location: 0, length: countElements(str)))
println(cowMatch.range)  // nil

如果我使用不同的范围,我可以使匹配成功:

let cowMatch2 = cowRegex.firstMatchInString(str, options: nil, 
                    range: NSRange(location: 0, length: str.utf16Count))
println(cowMatch2?.range)  // (7, 3)

但我不知道如何从字符串中提取匹配的文本,因为该范围超出了 Swift 字符串的范围。


事实证明,你可以以毒攻毒。使用 Swift 原生字符串utf16Count财产和substringWithRange:的方法NSString -- not String——得到正确的结果。这是完整的工作代码:

let str = "dog????????cow"
let cowRegex = NSRegularExpression(pattern: "c.w", options: nil, error: nil)!

if let cowMatch = cowRegex.firstMatchInString(str, options: nil,
                      range: NSRange(location: 0, length: str.utf16Count)) {
    println((str as NSString).substringWithRange(cowMatch.range))
    // prints "cow"
}

(我在写问题的过程中发现了这一点;给一分橡皮鸭调试 http://blog.codinghorror.com/rubber-duck-problem-solving/.)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在具有可变宽度 Unicode 字符的 Swift 字符串上使用 NSRegularExpression? 的相关文章

随机推荐

  • js - “间接”调用方法时“this”未定义

    我的目标是从函数表中调用函数来概括命令处理 即间接 很遗憾 this isundefined当这样称呼时 function Server this sessions server this this handlers dummy serve
  • using 块中实例化的所有一次性对象是否都已处理?

    这是我过去多次问自己的问题 因为我使用 5 层深度的语句进行嵌套 正在阅读docs http msdn microsoft com en us library yh598w02 aspx并没有发现任何提及other在块内实例化的一次性物品我
  • xunit 构造函数在每次测试之前运行

    我有一个测试类 在每次测试执行之前都会调用构造函数 目前 以下测试之间不共享构造函数初始化的数据 我希望初始化数据设置一次并在所有测试中共享 这是我的代码 Category Basics Collection DBCollection Ex
  • 从通知启动应用程序将其从最近的应用程序历史记录中删除

    当我从通知启动其中一个应用程序时 我遇到了问题 它永远不会出现在 最近使用的应用程序 列表中 如果没有通知 一切都会按预期进行 我启动应用程序 导航到并退出它 使用主页按钮或后退按钮 之后我可以长按主页按钮返回到它 gt 确定 当我收到通知
  • Proguard 不会混淆 gui 组件

    我想使用 ProGuard 来混淆我的 Android 应用程序 这很好用 但我的 gui 类 扩展了 Activity View 和 SherlockActivity 并没有被混淆 这是 proguard cfg injars bin c
  • Yii2:如何访问模板邮件中的参数?

    我有以下代码 Yii app gt mailer gt compose layouts html name gt this gt name email gt this gt email subject gt this gt subject
  • 防止调试 PhoneGap 应用程序

    我使用 PhoneGap 创建了一个 iOS 应用程序 我了解到将 iPhone 连接到 Mac 在 iPhone 上启用 Safari 调试 然后在 Mac 上使用 Safari 来查看属于该应用程序的所有 HTML 和 JavaScri
  • 如何在 iOS 中从图像处理中检测对象?

    我有一个图像 图像中有一个玻璃杯 两个勺子 此图像显示在 iPad 上 现在我希望当用户仅触摸勺子时 勺子颜色将变为绿色 图像的其余部分保持不变 我不知道该怎么做 从哪里开始呢 任何想法或建议都将受到高度欢迎 使用 CALayer 使用所需
  • 习惯从类型继承元类?

    我一直在尝试理解 python 元类 因此一直在浏览一些示例代码 据我了解 Python 元类可以是任何可调用的 所以 我可以让我的元类像 def metacls clsName bases atts return type clsName
  • 使用 PadRight 方法填充字符串

    我正在尝试在 C 中的字符串末尾添加空格 Trip Name1 PadRight 20 还尝试过 Trip Name1 PadRight 20 这些似乎都不起作用 不过我可以用任何其他字符填充字符串 为什么 我应该更具体 这是完整的代码 l
  • 在 Laravel 5 中动态编辑 .env 是个好主意吗?

    我正在构建一个管理面板 所以我需要做一些核心设置我的 Laravel 5 应用程序 如 smtp 设置等 可通过前端界面配置给最终用户 我最初的想法是使用数据库作为设置存储和缓存 以避免每次访问配置值时发出数据库调用 然而 看来 外观在配置
  • 在摘要报告侦听器文件名中使用时间函数

    在 JMeter 5 1 1 中 我有一个摘要报告 我试图将其保存为带时间戳的文件 文件名值如下所示 D Load Tests example com Results time yyyy MM dd HH mm ss summary csv
  • 在类 Unix 系统上获得以秒或毫秒为单位的正常运行时间

    我需要一种方法 可以给出自系统启动以来经过的毫秒数或秒数 我可以解析 proc uptime 但我不能因为这个 I 0 和解析而损失性能 我正在使用 Linux 和 C C 也许我可以添加一些 Qt Boost 但最好是原生的 为什么你读不
  • Entity Framework 4 与 LINQ to SQL,适用于中小型应用程序,与 SQL Server 配合使用

    早在 4 月份 VS2010 发布时 我就在 Stack Overflow 上看到过一些关于 L2S 与 EF4 的讨论 即 既然 Entity Framework 4 0 已经发布 就转储 Linq To Sql 吗 https stac
  • 尝试在 Flutter 上运行此处示例时出错

    所以我正在尝试将 Here 集成到我的 flutter 应用程序中 所以我正在关注这个页面flutter sdk 导航 https developer here com documentation flutter sdk navigate
  • 更新到 Mac OSX 10.9.4 后找不到 npm 命令

    将操作系统更新到 Mavericks 后 我无法在终端上执行 npm 命令 当我尝试这个时 node usr local lib node modules npm bin npm cli js v它正在工作并显示版本 1 4 3 我不知道这
  • Flash 功能中的冲突检测? (命中测试对象)

    你好 所以我最近一直在使用hitTestObject检测我正在制作的 Android 应用程序中的碰撞 经过一番测试后 我意识到游戏正在检测 假 碰撞 我的意思是它正在检测碰撞not当物体的像素接触时 但是 经过一些研究后 我发现boxes
  • 如何让每个
  • 标签一个接一个地慢慢出现
  • 我希望当页面加载时列表项慢慢地一个接一个地出现在屏幕上 这是jquery中的代码 我使用过show 但它不起作用 我确实在这里查找问题 其中一些正在使用附加方法 但这不是我要寻找的 html ul li A li li B li li C
  • Angular 4自带的form element组件

    我是角度初学者 我可能需要一些帮助 首先 我将展示它如何工作 然后我将写下我希望它如何工作 这是使用 ngModel 时的常规方式
  • 如何在具有可变宽度 Unicode 字符的 Swift 字符串上使用 NSRegularExpression?

    我无法获取NSRegularExpression匹配字符串中含有较宽 Unicode 字符的模式 看起来问题出在范围参数上 Swift 计算单个 Unicode 字符 而 Objective C 将字符串视为由 UTF 16 代码单元组成