iOS之— NSRegularExpression正则分割字符串

社交化越来为社会所接受,在做社会化产品时,在回复或者转发时会@他人 展示出来,点击@user 跳转到该用户的介绍页面,这里首先要制定恰当的标签,比如:<at href=\"jecky://profile/239\">iJecky</at>,然后客户端拿到文本时,要用到NSRegularExpression分割string,下面以富文本OHAttributedLabel来演示:

说明:本文中用到的contentLabel为OHAttributedLabel类型

示例:

NSString  *atstring = @"测试啊测试啊 <at href=\"jecky://profile/239\">iJecky</at> 测试啊测试啊";

首先分割:

NSMutableString *resultStr = [NSMutableString
stringWithCapacity:0];

NSString *pattern =
@"<at href=\"(.*?)\">(.*?)</at>";

NSRegularExpression *regex = [NSRegularExpression
regularExpressionWithPattern:pattern
options:0
error:nil];

NSArray *matches = [regex
matchesInString:atstring
options:0
range:NSMakeRange(0,
atstring.length)];

NSUInteger lastIdx =
0;

for (NSTextCheckingResult* match
in matches)

{

NSRange range = match.range;

if (range.location > lastIdx)

{

NSString  *temp = [atstring
substringWithRange:NSMakeRange(lastIdx, range.location - lastIdx)];

[resultStr appendString:temp];

}

NSString *link = [atstring
substringWithRange:[match
rangeAtIndex:1]];

NSString *text = [atstring substringWithRange:[match
rangeAtIndex:2]];

NSString *atName = [NSString
stringWithFormat:@"@%@",text];

[resultStr appendString:atName];

[markDic setObject:link
forKey:atName];

lastIdx = range.location + range.length;

}

if (lastIdx <
atstring.length)

{

NSString  *temp = [atstring
substringFromIndex:lastIdx];

[resultStr appendString:temp];

}

self.contentLabel.text = resultStr;

然后展示到contentLabel上

NSRegularExpression* userRegex = [NSRegularExpression
regularExpressionWithPattern:@"\\[email protected]\\w+"
options:0
error:nil];

NSMutableAttributedString* mas = [self.contentLabel.attributedText
mutableCopy];

[userRegex enumerateMatchesInString:self.contentLabel.text
options:0

range:NSMakeRange(0,self.contentLabel.text.length)

usingBlock:^(NSTextCheckingResult *match,
NSMatchingFlags flags, BOOL *stop){

NSString  *auser = [self.contentLabel.text
substringWithRange:match.range];

NSString  *atlink = [markDic
objectForKey:auser];

if (atlink) {

[mas setLink:[NSURL
URLWithString:[markDic objectForKey:auser]]
range:match.range];
// add it

}

}];

OHParagraphStyle* para = [OHParagraphStyle
defaultParagraphStyle];

para.firstLineHeadIndent =
0;

para.headIndent =
5;

para.tailIndent = -5;

para.textAlignment =
kCTTextAlignmentLeft;

[mas setParagraphStyle:para];

[OHASBasicMarkupParser
processMarkupInAttributedString:mas];

self.contentLabel.attributedText = mas;

时间: 2024-12-17 07:35:51

iOS之— NSRegularExpression正则分割字符串的相关文章

正则分割字符串、页面状态、渲染模式

//正则分割字符串 1 var ids=document.getElementsByClassName("div2"); 2 var cls=ids[0].className.split(/\s+/); 3 alert(cls.length); 4 for (var i = 0; i <cls.length; i++) { 5 if(cls[i] == "divs"){ 6 alert(i+" "+cls[i]); 7 }else if(c

regex 正则分割字符串

string _content=adak.sjdkajskj爱25教:师的656教案时; string en=@"\.|56|25";//单个[asj]分别以a,s,j为分隔符. var _array=Regex.Split(_content, en, RegexOptions.IgnorePatternWhitespace); 输出结果: 原文地址:https://www.cnblogs.com/weigetadie/p/10978510.html

按指定格式的子字符串,删除和分割字符串

删除就用- (NSString *)stringByReplacingOccurrencesOfString:(NSString *)target withString:(NSString *)replacement;将@“[:1:]"”,替换成@“” 分割就用- (NSArray *)componentsSeparatedByString:(NSString *)separator;根据你选定分割符拆分字符串 IOS字符串按特定字符拆分成数组 NSString * fruits = @&quo

iOS—身份证的正则校验

iOS—身份证的正则校验 说明: 在ios项目的开发中可能很多地方都需要用到身份证校验,一般在开发的时候很多人都是直接百度去网上荡相关的正则表达式和校验代码,但是网上疯狂 粘贴复制的校验代码本身也可能并不准确,可能会有风险,比如2013年1月1号起停止使用15位的身份证,网上的身份证校验普遍支持15位的号码. 在开发过程中,进行类似处理的时候,还是需要一些甄别的能力的,当然也要考虑自己的项目的实际情况.该文贴出了最近项目中使用到得身份证校验代码,以方便有需要的人“谨慎”获取. 一.规则 下面是i

银行卡号,指定字符长度分割字符串

每隔指定字符长度分割字符串,可以制作银行卡号格式化提示功能.利用正则替换实现.js代码如下; <script type="text/javascript"> console.log( "548481554521515454848798921258740".replace(/(\d{4})(?=\d)/g,"$1"+"-") ) </script>

iOS输入验证 正则 NSPredicate

iOS输入验证 正则 NSPredicate NSPredicate NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",pattern]; Format: (1)比较运算符>,<,==,>=,<=,!= 可用于数值及字符串 例:@"number > 100" (2)范围运算符:IN.BETWEEN 例:@"number BETWEEN

分割字符串

#include <stdio.h> #include <string.h> /* 分割字符串 */ int main(void){ char s[100] = "123-456-789-abc-edf"; //strtok第一次调用的时候,第一个参数是字符串, //但第二次调用的时候,第一个参数是NULL const char *buf =strtok(s,"-"); while(buf){ printf("%s\n",

php分割字符串

php分割字符串的函数 1,substr $str1 = substr($str,5); echo "从第5个字符开始取至最后:".$str1."; $str2 = substr($str,9,4); echo "从第9个字符开始取4个字符:".$str2."; $str3 = substr($str,-5); echo "取倒数5个字符:".$str3."; $str4 = substr($str,-8,4); e

根据标识符分割字符串

常常遇到根据某个标识符分割字符串,并将分割的结果保存到字符串数组中.遇到过以下几种需求: 分隔符是一个字符集和,以便处理不同的输入格式,比如用tab或逗号分隔的输入 处理2个分隔符之间的内容为空的情况,2种需求,输出空字符串或者忽略掉 处理字符串末尾的回车符,2种需求,忽略或删除 c语言的strtok函数支持分割字符串,它在遇到分隔符之间的内容为空的时候会忽略掉空元素,往前推进返回下个非空的字符串,分割完成后返回NULL.这个函数貌似还有个多线程的版本. //分割字符串,如果遇到分割的结果是空字