如何在 Objective C 中编写正则表达式(NSRegularExpression)?

2024-01-13

当我在 PHP 中测试这个正则表达式时,它可以工作,但它在 Objective C 中不起作用:

(?:www\.)?((?!-)[a-zA-Z0-9-]{2,63}(?<!-))\.?((?:[a-zA-Z0-9]{2,})?(?:\.[a-zA-Z0-9]{2,})?)

我尝试转义转义字符,但这也没有帮助。我应该逃避其他角色吗?

这是我在 Objective C 中的代码:

NSMutableString *searchedString = [NSMutableString stringWithString:@"domain-name.tld.tld2"];
NSError* error = nil;

NSRegularExpression* regex = [NSRegularExpression regularExpressionWithPattern:@"(?:www\\.)?((?!-)[a-zA-Z0-9-]{2,63}(?<!-))\\.?((?:[a-zA-Z0-9]{2,})?(?:\\.[a-zA-Z0-9]{2,})?)" options:0 error:&error];
NSArray* matches = [regex matchesInString:searchedString options:0 range:NSMakeRange(0, [searchedString length])];
for ( NSTextCheckingResult* match in matches )
{
    NSString* matchText = [searchedString substringWithRange:[match range]];
    NSLog(@"match: %@", matchText);
}

- 更新 -

这个正则表达式返回(在 PHP 中)带有值“domain-name”和“tld.tld2”的数组,但在 Objective C 中我只得到一个值:“domain-name.tld.tld2”

-- 更新 2 --

此正则表达式从字符串中提取“域名”和“TLD”:

  • example.com =(示例,com)
  • example.co.uk =(示例,co.uk)
  • -test-example.co.u =(测试示例,co)
  • -test-example.co.uk- =(测试示例,co.uk)
  • -test-example.co.u-k =(测试示例,co)
  • -test-example.co-m =(测试示例)
  • -test-example-.co.uk =(测试示例)

它需要有效的域名(不以“-”开头或结尾,长度在 2 到 63 个字符之间),以及 TLD 的最多两个部分(如果这些部分有效)(至少两个字符长,仅包含字母和数字)


A NSTextCheckingResult通过索引获得多个项目。

[match rangeAtIndex:0];是完整匹配。
[match rangeAtIndex:1];(如果存在)是第一个捕获组匹配。
etc.

你可以使用这样的东西:

NSString *searchedString = @"domain-name.tld.tld2";
NSRange   searchedRange = NSMakeRange(0, [searchedString length]);
NSString *pattern = @"(?:www\\.)?((?!-)[a-zA-Z0-9-]{2,63}(?<!-))\\.?((?:[a-zA-Z0-9]{2,})?(?:\\.[a-zA-Z0-9]{2,})?)";
NSError  *error = nil;

NSRegularExpression* regex = [NSRegularExpression regularExpressionWithPattern: pattern options:0 error:&error];
NSArray* matches = [regex matchesInString:searchedString options:0 range: searchedRange];
for (NSTextCheckingResult* match in matches) {
    NSString* matchText = [searchedString substringWithRange:[match range]];
    NSLog(@"match: %@", matchText);
    NSRange group1 = [match rangeAtIndex:1];
    NSRange group2 = [match rangeAtIndex:2];
    NSLog(@"group1: %@", [searchedString substringWithRange:group1]);
    NSLog(@"group2: %@", [searchedString substringWithRange:group2]);
}

NSLog 输出:

匹配:域名.tld.tld2
域名
tld.tld2

请测试匹配范围是否有效。

在这种情况下更简单:

NSString *searchedString = @"domain-name.tld.tld2";
NSRange   searchedRange = NSMakeRange(0, [searchedString length]);
NSString *pattern = @"(?:www\\.)?((?!-)[a-zA-Z0-9-]{2,63}(?<!-))\\.?((?:[a-zA-Z0-9]{2,})?(?:\\.[a-zA-Z0-9]{2,})?)";
NSError  *error = nil;

NSRegularExpression* regex = [NSRegularExpression regularExpressionWithPattern:pattern options:0 error:&error];
NSTextCheckingResult *match = [regex firstMatchInString:searchedString options:0 range: searchedRange];
NSLog(@"group1: %@", [searchedString substringWithRange:[match rangeAtIndex:1]]);
NSLog(@"group2: %@", [searchedString substringWithRange:[match rangeAtIndex:2]]);

斯威夫特 3.0:

let searchedString = "domain-name.tld.tld2"
let nsSearchedString = searchedString as NSString
let searchedRange = NSMakeRange(0, searchedString.characters.count)
let pattern = "(?:www\\.)?((?!-)[a-zA-Z0-9-]{2,63}(?<!-))\\.?((?:[a-zA-Z0-9]{2,})?(?:\\.[a-zA-Z0-9]{2,})?)"

do {
    let regex = try NSRegularExpression(pattern:pattern, options: [])
    let matches = regex.matches(in:searchedString, options:[], range:searchedRange)
    for match in matches {
        let matchText = nsSearchedString.substring(with:match.range);
        print("match: \(matchText)");

        let group1 : NSRange = match.rangeAt(1)
        let matchText1 = nsSearchedString.substring(with: group1)
        print("matchText1: \(matchText1)")

        let group2 = match.rangeAt(2)
        let matchText2 = nsSearchedString.substring(with: group2)
        print("matchText2: \(matchText2)")
    }
} catch let error as NSError {
    print(error.localizedDescription)
}

打印输出:

匹配:域名.tld.tld2
matchText1:域名
匹配文本2:tld.tld2

在这种情况下更简单:

do {
    let regex = try NSRegularExpression(pattern:pattern, options: [])
    let match = regex.firstMatch(in:searchedString, options:[], range:searchedRange)

    let matchText1 = nsSearchedString.substring(with: match!.rangeAt(1))
    print("matchText1: \(matchText1)")

    let matchText2 = nsSearchedString.substring(with: match!.rangeAt(2))
    print("matchText2: \(matchText2)")

} catch let error as NSError {
    print(error.localizedDescription)
}

打印输出:

matchText1:域名
匹配文本2:tld.tld2

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

如何在 Objective C 中编写正则表达式(NSRegularExpression)? 的相关文章

  • 根据 UIView/CGRect 的大小将图像裁剪为正方形

    我有一个 AVCaptureSession 的实现 我的目标是让用户拍照并只保存红色方形边框内的图像部分 如下所示 AVCaptureSession 的previewLayer 相机 跨越 0 0 左上角 到相机控制栏的底部 包含快门的视图
  • Cocoapods 和 Xcode,ld:找不到 -lAFNetworking 的库

    我有这个 pod 文件包含所有这些库 platform ios 7 0 target PP for iPad do pod AFNetworking 1 1 pod RaptureXML 1 0 pod NoticeView pod iVe
  • Grep 正则表达式以任意顺序查找单词

    Context 我想在很多源代码文件中找到一个类定义 但我不知道确切的名称 问题 我知道许多单词必须出现在我想要查找的行中 但我不知道它们出现的顺序 有没有快速查找多个单词的方法以任何顺序在同一条线上 对于需要搜索大量单词的情况 可以使用
  • Skobbler 地图无法使用 ZoomToRouteWithInsets 进行缩放

    在skobbler地图上 我计算了一条路线 如果我拖动地图中的某个位置 然后在按钮中单击 我想查看我的路线 在文档中给出了这些方法 将地图缩放到当前计算的路线 SKRoutingService sharedInstance zoomToRo
  • 存储应用内购买的正确且安全的方式

    在设备上存储应用内购买的最佳方式是什么 这样购买也可以离线访问 但是 购买的安全性没有受到损害 不要在设备上存储任何有价值的东西 因为它不可信 并且很容易被有动机的人破坏 现在 所有这一切都取决于所购买物品的类型和价值 以及如果物品受损会发
  • 访问 iPhone 上用户的短信

    有没有一种方法可以访问用户的短信 没有互联网连接 显然 不尝试获取客户的消息 并分析应用程序中的文本 如果没有 出于安全原因 这是完全可以理解的 但我想我还是会问 不 你只能发送它们 S http developer apple com l
  • 应用程序名称中的撇号

    我打算在 Apple 商店中发布一款标题中包含撇号的应用程序 我注意到 当 目标 名称包含撇号时 XCode 在构建代码时已经存在问题 我已经通过使用以下字符设法解决了这个问题 暂时 与以下相反 这似乎构建得不错 但我有点担心以后可能会发生
  • 无法使用应用程序加载器将 .ipa 上传到 iTunes

    我正在尝试将我的 iPhone ipa 文件上传到 iTunesconnect 我什至最近通过应用程序加载器成功地将构建上传到 iTunes Connect 但从过去两天开始 当我尝试上传 ipa 时 出现以下错误 并且 ipa 未上传到
  • 如何在 ios7 中的 UITextfield 中禁用复制/粘贴选项

    I tried implementation UITextField DisableCopyPaste BOOL canPerformAction SEL action withSender id sender return NO retu
  • 正则表达式多次匹配多行

    我有一个像这样的字符串 Name John Doe Age 23 Primary Language English Description This is a multiline description field that I want
  • 用我自己的视图替换 UIViewController 根视图

    我正在尝试用子类 UIView 替换 UIViewController 根视图 在 iPhone SDK 的 UIViewController 类参考的概述部分中 有这样的说明 您使用 UIViewController 的每个实例来管理全屏
  • tkinter - 在askopenfile期间检索文件名

    我有一个用 Python 和 tkinter 制作的文本编辑器 这是我的 打开文件 方法 def onOpen self file askopenfile filetypes Text files txt txt file read sel
  • SpriteKit中滚动背景的速度逐渐增加

    我正在 SpriteKit 中制作一个简单的游戏 并且我有一个滚动背景 简单的情况是 在加载游戏场景时 一些背景图像彼此相邻放置 然后当图像滚动到屏幕外时 图像会水平移动 这是我的游戏场景中的代码didMoveToView method s
  • iOS9 按需访问和下载资源

    我正在尝试实现新的 iOS9 功能应用程序细化 我了解如何在 Xcode 7 中标记图像并启用按需资源 但我不明白如何在我的应用程序中实现 NSBundleResourceRequest 有人可以帮助我 我将不胜感激 大部分信息都可以在 A
  • Java 将字符串拆分为单词逗号和句号

    我一直在使用myString split s 得到每个单词 但现在我想把逗号和句号也分开 例如 妈妈总是说生活就像一盒巧克力 你永远不知道会得到什么 to Mama always said life was like a box of ch
  • 我在这个正则表达式中做错了什么?

    我正在做一个关于正则表达式的学校作业 我先解释一下 我必须编写一个正则表达式来检查 URL 我必须检查的条件是 URL 是 http s 还是 ftp s 域名是 nl 还是 edu 至少有一个第三级域名 但如果该域名以 万维网 必须有一个
  • 规划带有透明覆盖图像的科尔多瓦相机插件

    我正在编写和应用程序 需要在相机上显示透明图像 例如作为构图指南 该应用程序必须至少在 iOS 和 Android 上发布 到目前为止 我已经找到了一个具有功能 iOS 源的插件 okstate plugin camera overlay
  • 如何检查 iPhone 的 IPv6 地址

    我已经根据苹果的建议设置了 IPv6 nat64 环境 https developer apple com library ios documentation NetworkingInternetWeb Conceptual Network
  • presentOpenInMenuFromBarButtonItem:不会导致菜单出现

    我试图通过以下方式显示 打开方式 菜单UIDocumentInteractionController and presentOpenInMenuFromBarButtonItem 这不会提出UIDocumentInteractionCont
  • Perl 电话号码正则表达式

    抱歉问这么简单的问题 我还是一个没有经验的程序员 我在工作中偶然发现了一些旧 Perl 代码中的电话号码匹配正则表达式 如果有人能准确解释它的含义 我的正则表达式技能严重缺乏 我会很高兴 if value space 0 9 0 9 spa

随机推荐

  • Laravel 5 中用于管理或身份验证的 Laravel 中间件

    我是 Laravel 的新手 不了解 Laravel 限制机制 我读过有关中间件的内容 但很困惑如何使用它 为什么使用它以及它如何工作 所以请指导我如何实现它以达到限制目的 即对于 auth sa 用户路由 确保您在数据库用户表中有角色列或
  • Sitecore 中子布局的多变量测试

    我过去曾尝试过这个概念 现在对在我公司的 Sitecore 网站上使用多变量测试感兴趣 我认为在很多地方我们绝对可以通过使用 A B 测试来提高销量 运行两个完全不同的模板 看看哪种布局更适合用户 在网站上运行许多不同的子布局 表单 以查看
  • PHP 中的重音符号 (`)(不是单引号)代表什么?

    在下面的示例中 第二行中的重音符号是什么意思 cmd ffmpeg i video deinterlace an ss second t 00 00 01 r 1 y vcodec mjpeg f mjpeg image 2 gt 1 re
  • 将版本放入我的 java 应用程序 - Netbeans

    有什么方法可以在 netbeans 中为我的应用程序提供版本号 然后在我的代码中访问该版本号 类似于我们在 Net 中使用的程序集号 在 java 或 netbeans 中是否有类似的东西 定义一个Implementation Versio
  • 保留 Spark Streaming 输出

    我正在从消息传递应用程序收集数据 我目前正在使用 Flume 它每天发送大约 5000 万条记录 我想用卡夫卡 使用 Spark Streaming 从 Kafka 消费 并将其保存到 hadoop 并使用 impala 进行查询 我尝试过
  • Vue.js 组件渲染后是否会触发事件?

    我在 Vue js 中有一些自定义组件 在我拥有的一个组件中有一个选择列表 我想将其呈现为Chosen http harvesthq github io chosen 选择框 我将其与 jQuery 函数一起使用 select chosen
  • 如何在 Firefox 和 Opera 中缩放 HTML 元素?

    如何在 Firefox 和 Opera 中缩放 HTML 元素 The zoom该属性在 IE Google Chrome 和 Safari 中有效 但在 Firefox 和 Opera 中无效 有什么方法可以将这个属性添加到 Firefo
  • JaxB读取类层次结构

    只是延伸使用 JaxB 解析类层次结构 https stackoverflow com questions 15676401 parsing class hierarchy using jaxb问题 想要使用 JaxB 读取以下 xml 文
  • 我需要引用命令替换吗?

    根据Google Shell 风格指南 https google github io styleguide shell xml Quoting 我应该 始终引用包含变量 命令替换 空格或 shell 元字符的字符串 除非需要小心的不带引号的
  • 是否可以让 Azure Pipeline 在提交时修改 README.md?

    我正在尝试在 Azure DevOps Repo 中自动生成和更新代码文档 我已经配置了一个管道 以便在提交到 master 分支时运行 python 脚本 该脚本从存储库中的文件中提取相关信息并创建一个 markdown 文件并将输出存储
  • 直接以 PDF 格式打印通过 JSP 动态创建的输出

    我通过 JSP 通过访问数据库动态打印报告 我正在使用Struts 框架和Java代码位于Action类中 最后通过显示输出 JSP 页面 它在屏幕上显示得很好 但在打印时却无法正常显示 我只想以 PDF 格式显示报告 而不是 JSP gt
  • 各种切入点表达式作用域意外触发多个通知调用

    背景 使用方面记录项目 例如所有标有 Log注释将信息写入日志文件 Problem 方法似乎是递归调用一级深度的 但代码没有显示任何这样的递归关系 Actual 记录结果 2018 09 25 12 17 29 155 EmailNotif
  • jquery获取光标所在元素

    我正在使用 javascript 和 jquery 为我的网站构建一个分割测试工具 现在 当光标经过预览框中的元素时 我想为每个要拆分测试的元素显示一个小悬停菜单 有可能做这样的事情吗 我尝试过这样的事情 body hover functi
  • 如何将框架添加到Swift项目中?

    我想向我的 Swift 项目添加一个库 我发现了 3 个不同的地方需要添加 我想知道执行此操作的正确方法以及每种方法的目的 常规选项卡 选择目标 gt 常规 嵌入二进制文件 链接的框架和库 构建阶段 选择目标 gt 构建阶段 嵌入框架 将二
  • 在 C 中打印声明的 char 值

    我知道字符变量的范围是从 有符号 128 到 127 和 无符号 0 到 255 char x x 128 printf d n x 但它是如何运作的呢 为什么我得到 128 for x printf是一个可变参数函数 仅提供第一个参数的精
  • 初始化 char 和 char 指针

    这些有什么区别 这个有效 char pEmpty new char pEmpty x 但是 如果我尝试这样做 char pEmpty NULL pEmpty x lt doesn t work and char pEmpty x putti
  • 在 Visual Basic 中寻找权威的 ISO 周计算器(在 Visual Studio Express 2010 中)

    我正在寻找一个明确的标准 即经过认证是正确的或经过相当彻底的测试 用于在 Visual Basic 中计算某个日期的 ISO 周 即在 Visual Studio Express 2010 Visual Basic 项目中运行 不成功 到目
  • adb shell 命令:mkdir(用于创建目录)

    我正在尝试通过 adb shell 创建目录 我必须在 etc 文件夹中创建一个目录 但没有成功 我设法弄清楚它是链接到的 system etc并尝试创建 system etc 但在这两种情况下我都得到 只读文件系统 如何使其可读可写 我尝
  • if语句与if-else语句,哪个更快?

    前几天我和一个朋友争论了这两个片段 哪个更快 为什么 value 5 if condition value 6 and if condition value 6 else value 5 What if value是一个矩阵 注 我知道va
  • 如何在 Objective C 中编写正则表达式(NSRegularExpression)?

    当我在 PHP 中测试这个正则表达式时 它可以工作 但它在 Objective C 中不起作用 www a zA Z0 9 2 63