iOS截取特定的字符串(正则匹配)

有时候我们会有需求从一个字符串中截取其他的字符串,根据情况的不同,我们来分析几种方法~~

一. 固定长度字符串中截取固定位置长度的字符串

// 这是比较简单的一种情况:比如截取手机号的后4位
 let phoneNum = "18515383061"
 var suffixNum:String?
 // 从倒数第四位开始截取,截取到最后
 suffixNum = phoneNum.substringFromIndex(phoneNum.endIndex.advancedBy(-4))
 // 从开头截取到第三位,获取手机号前3位
 let prefixNum = phoneNum.substringToIndex(phoneNum.startIndex.advancedBy(3))
 // 截取区间内字符串
 suffixNum = phoneNum.substringWithRange(phoneNum.endIndex.advancedBy(-4)..<phoneNum.endIndex)

二. 不固定长度的字符串,但是有分隔符

 //例如获取日期中的年,月,日
 // 分割符可以是任意的字符,一般为‘/‘,‘_‘,‘空格‘,或者是特殊的字符.
 let timeStr = "2013/10/26"
 let timeArr = timeStr.componentsSeparatedByString("/")
 print(timeArr)

三. 不固定长度的字符串,取特殊规则下的字符串

 // 如下所示,我们想要截取第一个中括号里面的字符串
 // 假设这个字符串是服务器返回的,长度不定,中括号的位置也不定,先后通过简单的截取就比较困难了
 // 这个时候就要用到**正则表达式**,相信大家知道,但如何在Swift中利用正则表达式来筛选值呢,我们来分析一下
 // rangOfString本来是用来收索文中的字符串的,但是可以选择模式.这里选择(.RegularExpressionSearch)也就是正则的搜索
 // 但是OC和Swift中都只有这一种收索方法,只有Search,没有其他的,相比其他的语言(Python,PHP)弱太多了

 // 单纯匹配中括号里的字正则想必大家都会写 "\\[.*\\]",但是有一个问题就是收索的内容是‘[thing] jflsdfs [do]‘,这显然不是我们想要的
 // 这就要收到正则的贪婪模式了,默认它尽可能多的匹配符合要求的字符串,而我们想让他满足最精巧的那个,就需要加上一个?号,就是这个样子"\\[.*?\\]",这样搜索到的就是‘[thing]‘
 // 你发现这还不是我们想要的,为什么要带上‘[‘和‘]‘呢,但是没办法,这是你的检索条件啊
 // 但是什么也难不倒正则,正则当中有 零宽断言,<零宽度正预测先行断言(?=exp)> 断言自身出现的位置的后面能匹配表达式exp,
 // <零宽度正回顾后发断言(?<=exp)>,它断言自身出现的位置的前面能匹配表达式exp,最终我们的表达式是"(?<=\\[).*?(?=\\])"

 let string = "I Want to Do some [thing] jflsdfs [do]"
 if let result = string.rangeOfString("(?<=\\[).*?(?=\\])", options: .RegularExpressionSearch, range:string.startIndex..<string.endIndex, locale: nil)  {
         print(string.substringWithRange(result))
     }

作者:SSBun链接:http://www.jianshu.com/p/d6fcc9bcd8de來源:简书著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
时间: 2024-10-09 07:22:47

iOS截取特定的字符串(正则匹配)的相关文章

特定中文字符串正则匹配

最近遇到了一个匹配中文特定字符串的问题,记录下来 问题描述:匹配"美丽乡村"中的一个字符或几个,如果是多个字符,顺序不能改变,如"丽乡" 解决过程: 之前知道匹配中文字符串,正则表达式中使用的是unicode编码的范围,如/^[x{4e00}-x{9fa5}]+$/u 想着特定字符是否可以不用转换成unicode编码,于是写出正则  '/^[美]{0,1}[丽]{0,1}[乡]{0,1}[村}]{0,1}$/u',总不能正确匹配 于是把汉字改成unicode编码,正

js截取相应的域名----正则匹配法 和校验Url 正则表达式

js截取相应的域名----正则匹配法 和校验Url 正则表达式 用javascript截取相应的域名方法两种,供大家参考 1.方法1: [javascript] view plain copy function domainURI(str){ var durl=/http:\/\/([^\/]+)\//i; domain = str.match(durl); return domain[1]; } 调用:var domain=domainURI(document.location.href);

关于Boost,C Regex对短目标字符串正则匹配的性能分析

昨天对长目标字符串下的各种正则匹配库性能进行了总结,得出结论是Boost regex性能最佳.今天将其应用到项目当中,果不其然,长字符串匹配带来的性能损失基本没有了,当然,目前规模并不算太大,但是在可预计规模内Boost可以完全达到要求. 不过有一点,在Boost,C同时去除长字符串匹配的影响后,剩下都是短字符串匹配,发现Boost比C好的并不是好很多,例如10000+次短字符匹配中,其中包含匹配成功和不成功的,Boost regex+系统其他模块用时130ms左右,而C regex+系统其他模

Python之字符串正则匹配

需求: 正则表达式匹配某个文本模式,但是它找到的是模式的最长可能匹配(因为是贪婪匹配 ). 而你想修改它变成查找最短的可能匹配. import re text2 = 'Computer says "no." Phone says "yes."' str_pat=re.compile(r'"(.*)"') # 匹配引号包裹的任意文本,并编译 print(str_pat.findall(text2)) #['no." Phone says

字符串正则匹配(递归/DP)

Wildcard-Matching &  Regular Expression Matching Wildcard-Matching中?匹配任意一个字符,*匹配任意长度字符串包括空字符串 方法一:记录*的位置,分别考虑*匹配空,匹配一个,匹配两个,三个... 1 bool isMatch(const char *s, const char *p) { 2 int sStar=-1,pStar=-1; 3 int i=0,j=0; 4 for(i=0;i<strlen(s);)//不考虑p字符

字符串正则匹配替换

re.sub的功能 re是regular expression的缩写,表示正则表达式:sub是substitude的缩写,表示替换 re.sub是正则表达式的函数,实现比普通字符串更强大的替换功能 sub(pattern,repl,string,count=0,flag=0) 1))pattern正则表达式的字符串 eg中r'\w+' 2))repl被替换的内容eg中'10' 3))string正则表达式匹配的内容eg中"xy 15 rt 3e,gep" 4))count:由于正则表达

js正则实现从一段复杂html代码字符串中匹配并处理特定信息

js正则实现从一段复杂html代码字符串中匹配并处理特定信息 问题: 现在要从一个复杂的html代码字符串(包含各种html标签,数字.中文等信息)中找到某一段特别的信息(被一对“|”包裹着),并对他进行加粗.加下滑线处理. 解决思路: 1.用正则匹配“|”出现的次数,处理刚好出现2次的(html字符串中一般不会含有这个字符) 2.使用正则分组,获取“|”之间的内容,并进行替换(添加样式) 代码: function specialDeal(){ htmlStr = htmlStr.replace

iOS 中的正则匹配(工具类)

正则表达式 正则表达式是对字符串操作的一种逻辑公式, 用事先定义好的一些特定字符.及这些特定字符的组合, 组成一个"规则字符串", 这个"规则字符串"用来表达对字符串的一种过滤逻辑, 正则表达式就是用于描述这些规则的工具, 或者说, 正则表达式就是记录文本规则的代码. 在开发中, 我们经常会有查找符合某些复杂规则的字符串的需要, 比如数据校验: 判断用户的输入是否合法(如:用户注册的时候,QQ号码,电话号码,邮箱是否符合要求) 下面让我们先来看看正则匹配常用的一些字

关于html字符串正则判断和匹配的具体使用

前言最近在写一个组件,需要传入html字符串,里面用到了很多正则来判断是否是html标签或者匹配标签内的文本等,这里记录下.如何判断传入的字符串包含一个闭合html标签/<\/?[a-z][\s\S]>/i这个其实并不能判断标签闭合的完整性或者顺序等,只是判断字符串中是否有html标签(包含自定义标签),这对我来说足够了.这给正则里面需要学习的就是[\s\S]可以代表一切字符串./<([a-z][\s\S])>.<\/\1>/i这个就更加规范一些可以匹配一个完整闭合的标