首先上代码(效果图在最下方):

    //找到你要赋值的那个控件TextView tv_phone = findViewById(R.id.tv_phone);//先定义一串字符串(包含手机号和座机号)String str = "电话是15800000000和0754-84571539";//新建列表用来存储提取到的手机号和座机号List<String> phones = new ArrayList<>();//如果提取到的手机号不为空则加入列表List<String> cellphone = checkCellphone(str);if (cellphone != null && cellphone.size() > 0) {phones.addAll(cellphone);}//如果提取到的座机号不为空则加入列表List<String> telephone = checkTelephone(str);if (telephone != null && telephone.size() > 0) {phones.addAll(telephone);}//对字符串中的手机号添加下划线和点击事件SpannableString spannableString = addClickToString(str, phones);tv_phone.setText(spannableString);//tv_phone.setMovementMethod(LinkMovementMethod.getInstance());//下面是对前面几个函数方法的实现/*** 查询符合的手机号码* @param str*/public static List<String> checkCellphone(String str) {// 将给定的正则表达式编译到模式中Pattern pattern = Pattern.compile("(13[0-9]|14[579]|15[0-3,5-9]|16[6]|17[0135678]|18[0-9]|19[89])\\d{8}");// 创建匹配给定输入与此模式的匹配器。Matcher matcher = pattern.matcher(str);// 创建列表用来存储提取的手机号码List<String> list = new ArrayList<>();//查找字符串中是否有符合的子字符串while (matcher.find()) {//查找到符合的即添加到列表中list.add(matcher.group());}return list;}/*** 查询符合的固定电话* @param str*/public static List<String> checkTelephone(String str) {// 将给定的正则表达式编译到模式中Pattern pattern = Pattern.compile("(0\\d{2}-\\d{8}(-\\d{1,4})?)|(0\\d{3}-\\d{7,8}(-\\d{1,4})?)");// 创建匹配给定输入与此模式的匹配器。Matcher matcher = pattern.matcher(str);// 创建列表用来存储提取的手机号码List<String> list = new ArrayList<>();//查找字符串中是否有符合的子字符串while (matcher.find()) {//查找到符合的即添加到列表中list.add(matcher.group());}return list;}/*** 对字符串中的号码添加点击事件** @param str:    要处理的字符串* @param phones: 号码列表*/private SpannableString addClickToString(String str, List<String> phones) {SpannableString spannableString = new SpannableString(str);for (int i = 0; i < phones.size(); i++) {String phone = phones.get(i);spannableString.setSpan(new Clickable(new View.OnClickListener() {@Overridepublic void onClick(View view) {Intent intent = new Intent(Intent.ACTION_DIAL, Uri.parse("tel:" + phone.replaceAll("-", "")));context.startActivity(intent);}}),str.indexOf(phones.get(i)),   //定位该字符串在整个字符串中第一次出现的位置str.indexOf(phones.get(i)) + phones.get(i).length(),  //该字符串在整个字符串中结束的位置Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);}return spannableString;}class Clickable extends ClickableSpan {private final View.OnClickListener mListener;public Clickable(View.OnClickListener listener) {mListener = listener;}/*** 重写父类点击事件* @param view*/@Overridepublic void onClick(@NonNull View view) {mListener.onClick(view);}@Overridepublic void updateDrawState(@NonNull TextPaint ds) {super.updateDrawState(ds);ds.setUnderlineText(true);  //true显示下划线,false下划线不显示ds.setColor(context.getResources().getColor(R.color.blue));    //设置字体颜色}}

前面的特殊字段不一定要是电话号码,可以根据自己的需要进行调整,然后此处的点击事件是实现电话号码的跳转,用户也可以根据自己的真实需求进行修改。

相关的用法和作用里面的注释也写的很清楚了。

最后的实现图如下:

Android提取字符串中的特殊字符(以手机号为例)并修改样式和添加点击事件相关推荐

  1. java 正则 提取数字_java使用正则提取字符串中的数字(例如提取短信中的验证码)详解...

    使用java正则可以很方便的从字符串中提取符合条件的内容. 1.提取字符串中所有的手机号: private void getPhoneNum(String smsBody) { Pattern pat ...

  2. android 短信 字符 执行,Android短信中的特殊字符

    我已经观察了这个问题多年,现在不知道它来自哪里.我担心这个bug在2011年的新版Android中仍然可以观察到,并且我希望如果不解决它,我终于可以帮助我完全理解它.Android短信中的特殊字符 让 ...

  3. python 正则之提取字符串中的汉字,数字,字母

    python 正则之提取字符串中的汉字,数字,字母 #\d 匹配一个数字字符.等价于 [0-9] #\D 匹配一个非数字字符.等价于 [^0-9]#过滤字符串中的英文与符号,保留汉字 import r ...

  4. 【Java】不需要正则表达式,提取字符串中的所有汉字、数字、字母

    功能 提取字符串中的所有汉字.数字.字母 测试用例 待提取的字符串:Th<><?isI":sa--S??/t+-/ring,这? ???~!===是!$#@%^&一 ...

  5. linux 取出字符中数字,使用awk提取字符串中的数字或字母

    1.提取字符串中的数字$ echo 'dsFUs34tg*fs5a%8ar%$#@' |awk -F "" ' { for(i=1;i<=NF;i++) { if ($i ~ ...

  6. 正则表达式 - 去掉乱码字符/提取字符串中的中文字符/提取字符串中的大小写字母 - Python代码

    目录 1.乱码符号种类较少,用replace() 2.乱码字符种类较多,用re.sub() 3.提取字符串中的中文字符 4.提取字符串中的中文字符和数字 5.提取其他 数据清洗的时候一大烦恼就是数据中 ...

  7. c语言十六进制字符串转整数,C语言-提取字符串中的十六进制数字并转换为一个十进制整数输出...

    问题描述:提取字符串中的十六进制数字并转换为一个十进制整数输出 源代码: /*十六进制转换成十进制*/ #include int main(void) { int i,k; char hexad[80 ...

  8. [转载] java提取字符串中的字母数字

    参考链接: 使用Regex检查字符串在Java中是否仅包含字母 String str = "adsf    adS DFASFSADF阿德斯防守对方asdfsadf37<?:?@%#¥ ...

  9. awk 内嵌正则 提取字符串_使用awk提取字符串中的数字或字母

    1.提取字符串中的数字 $ echo 'dsFUs34tg*fs5a%8ar%$#@' |awk -F "" ' { for(i=1;i<=NF;i++) { if ($i ...

最新文章

  1. 3篇量子计算里程碑论文同登Nature封面:保真度超99%,达到实用化水平
  2. linux monitor模式,ubuntu14.04 安装linux-802.11n csitool Monitor模式
  3. 044_定义类或对象
  4. jvm执行引擎全解,java解释器即时编译器,全都讲明白
  5. docker 每次都得source /etc/profile以及如何查看Docker容器环境变量、向容器传递环境变量
  6. python怎样打开加密的文件_如何用Python 加密文件
  7. Eclipse3.7 Indigo 字体设置为Courier New
  8. 指针选择排序法,10个整数从小到大排序
  9. Atitit.eclipse git使用
  10. jmeter 控制偏离_Jmeter(二十) - 从入门到精通 - JMeter监听器 -下篇(详解教程)
  11. xshell和xftp免费版下载地址
  12. Modbus协议的PLC、智能仪表数据采集至SQL数据库,实现双向通讯
  13. 清华教授!亲手教你JavaScript 在线解压 ZIP 文件,实战理论全都有
  14. html插入视频快捷键代码,pr添加关键帧的快捷键是什么?
  15. html常用代码大全
  16. 部分国内外遥感与GIS杂志(小百合)
  17. SBUS协议(20200210)
  18. 宝剑配英雄,玫瑰赠伊人!(祝全天下静姝妇女节快乐!)
  19. Spring Boot 实现接口幂等性的 4 种方案作者:小小怪下士
  20. java8新特性之Stream流

热门文章

  1. Python:Flask使用jsonify格式化时间
  2. 一个完整的短视频包含哪些要素?做短视频还要学会把控全局
  3. 用于描述三维矢量旋转的四元数法的一点理解
  4. 赛迪顾问 | 政府大数据行业深度解读
  5. 35 岁以后,你凭什么安身立命?
  6. 北极光创投吴炯:寻找下一个马云
  7. linux ospf 命令,用bird 在linux netns里配置ospf两个点互相发现
  8. 欧拉 phi 函数的积性证明
  9. 用java绘制火焰_用 CSS 实现火焰特效?不在话下
  10. 个人推广APP的心得:有的放矢