正则表达式,判断一串字符串里面包含一定的形式,并解析成图片

这个事写qq表情的时候用到的,单独拿出来讲讲。

首先图片0到106张放在res里面,命名为F000到F106 如图

此时在程序里面定义一个方法

public void setData(String msg){

String str = msg;
//消息具体内容

String zhengze = "f0[0-9]{2}|f10[0-7]";
//正则表达式,用来判断消息内是否有表情

try {

SpannableString spannableString = ExpressionUtil.getExpressionString(context, str, zhengze);

content.setText(spannableString);

} catch (Exception e) {

e.printStackTrace();

}

}

ExpressionUtil的类是这样的

public class ExpressionUtil {

/**

* 对spanableString进行正则判断,如果符合要求,则以表情图片代替

*/

public static void dealExpression(Context context,SpannableString spannableString, Pattern patten, int start) throws SecurityException, NoSuchFieldException, NumberFormatException, IllegalArgumentException, IllegalAccessException {

Matcher matcher = patten.matcher(spannableString);

while (matcher.find()) {

String key = matcher.group();

if (matcher.start() < start) {

continue;

}

Field field = R.drawable.class.getDeclaredField(key);

int resId = Integer.parseInt(field.get(null).toString());
//通过上面匹配得到的字符串来生成图片资源id

if (resId != 0) {

Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), resId);

ImageSpan imageSpan = new ImageSpan(bitmap);
//通过图片资源id来得到bitmap,用一个ImageSpan来包装

int end = matcher.start() + key.length();
//计算该图片名字的长度,也就是要替换的字符串的长度

spannableString.setSpan(imageSpan, matcher.start(), end, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
//将该图片替换字符串中规定的位置中

if (end < spannableString.length()) {
//如果整个字符串还未验证完,则继续。。

dealExpression(context,spannableString,  patten, end);

}

break;

}

}

}

/**

* 得到一个SpanableString对象,通过传入的字符串,并进行正则判断

* @param context

* @param str

* @return

*/

public static SpannableString getExpressionString(Context context,String str,String zhengze){

SpannableString spannableString = new SpannableString(str);

Pattern sinaPatten = Pattern.compile(zhengze, Pattern.CASE_INSENSITIVE);
//通过传入的正则表达式来生成一个pattern

try {

dealExpression(context,spannableString, sinaPatten, 0);

} catch (Exception e) {

Log.e("dealExpression", e.getMessage());

}

return spannableString;

}

通过这个判断设置,就可以把字符串中带F000的一些字符串转换我图片qq表情。

正则表达式,判断一串字符串里面包含一定的形式,并解析成图片

时间: 2024-10-11 20:36:32

正则表达式,判断一串字符串里面包含一定的形式,并解析成图片的相关文章

Java中判断某一字符串是否包含数字、字母和中文

在Java中判断某一字符串是否为纯英文.纯数字.英文和数字的组合等时,通常使用正则str.matches匹配,告诉这个字符串是否与给定的正则表达式匹配. 各种字符的unicode编码的范围: 汉字:[0x4e00,0x9fa5](或十进制[19968,40869]) 数字:[0x30,0x39](或十进制[48, 57]) 小写字母:[0x61,0x7a](或十进制[97, 122]) 大写字母:[0x41,0x5a](或十进制[65, 90]) import java.util.regex.M

[leetcode]242. Valid Anagram判断两个字符串是不是包含相同字符的重排列

/* 思路是判断26个字符在两个字符串中出现的次数是不是都一样,如果一样就返回true. 记住这个方法 */ if (s.length()!=t.length()) return false; int[] words = new int[26]; for (int i = 0; i < s.length(); i++) { words[s.charAt(i)-'a']++; words[t.charAt(i)-'a']--; } for (int i = 0; i < 26; i++) { i

正則表達式,推断一串字符串里面包括一定的形式,并解析成图片

这个事写qq表情的时候用到的,单独拿出来讲讲. 首先图片0到106张放在res里面,命名为F000到F106 如图 此时在程序里面定义一个方法 public void setData(String msg){ String str = msg; //消息详细内容 String zhengze = "f0[0-9]{2}|f10[0-7]"; //正則表達式.用来推断消息内是否有表情 try { SpannableString spannableString = ExpressionUt

C# 正则表达式 判断各种字符串(如手机号)

1 using System; 2 using System.Text.RegularExpressions; 3 namespace MetarCommonSupport 4 { 5 /// <summary> 6 /// 通过Framwork类库中的Regex类实现了一些特殊功能数据检查 7 /// </summary> 8 public class MetarnetRegex 9 { 10 11 private static MetarnetRegex instance =

判断字符串中包含3个连续(升、降)或相同的数字

有网友问及“asp.net怎么判断一个手机号字符串中包含3个连续的字符或3个相同的字符?”: Insus.NET做了一下练习,并把方法分享,希望网友们能从中获取一些启示.面向对象嘛,先写一个Number类,用来处理号码之用,很是一个很简单的类,一目了然. #38至#41的方法,IsUpNumber()判断是否为连续升序的数字.#43至#46的方法,IsDownNumber()判断是否为连续降序的数字.#48至#51的方法,IsSameNumber()判断是来为连续相同的数字.#53至#57的方法

正则表达式里字符串”不包含”匹配技巧

经常我们会遇到想找出不包含某个字符串的文本,程序员最容易想到的是在正则表达式里使用,^(hede)来过滤"hede"字串,但这种写法是错误的.我们可以这样写:[^hede],但这样的正则表达式完全是另外一个意思,它的意思是字符串里不能包含'h','e','d'三个但字符.那什么样的正则表达式能过滤出不包含完整"hello"字串的信息呢? 事实上,说正则表达式里不支持逆向匹配并不是百分之百的正确.就像这个问题,我们就可以使用否定式查找来模拟出逆向匹配,从而解决我们的问

SQL中判断字符串中包含字符的方法

通过2个函数CHARINDEX和PATINDEX以及通配符的灵活使用函数:CHARINDEX和PATINDEXCHARINDEX:查某字符(串)是否包含在其他字符串中,返回字符串中指定表达式的起始位置.PATINDEX:查某字符(串)是否包含在其他字符串中,返回指定表达式中某模式第一次出现的起始位置:如果在全部有效的文本和字符数据类型中没有找到该模式,则返回零.特殊:可以使用通配符! 例子:1. 查询字符串中是否包含非数字字符SELECT PATINDEX('%[^0-9]%', '1235X4

(KMP 1.6)hdu 2203 亲和串(判断文本串循环移位之后是否能将模式串包含在其中)

题目: 亲和串 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 9139    Accepted Submission(s): 4174 Problem Description 人随着岁数的增长是越大越聪明还是越大越笨,这是一个值得全世界科学家思考的问题,同样的问题Eddy也一直在思考,因为他在很小的时候就知道亲和串如何判断了,但是发现,

IOS中用正则表达式判断输入的内容为8-16位且同时包含数字和字母

今天在项目中需要用到判断用户输入的用户名长度为8-16位且同时包含数字和字母,在网上搜了一下正则表达式的用法,然后参考这篇blog,完美解答了问题.记录一下: 密码有如下要求:由数字和字母组成,并且要同时含有数字和字母,且长度要在8-16位之间. 如何分析需求?拆分!这就是软件设计的一般思路了.于是乎,拆分需求如下: 1,不能全部是数字 2,不能全部是字母 3,必须是数字或字母 只要能同时满足上面3个要求就可以了,写出来如下: 1 ^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-