最近开发遇到一个新的东西,就是前端传过来一个字符串,需要将里面的数字提取出来,倒腾了一天,最后还是没有倒腾出来,最后还是借鉴大佬的方法。记录一下。

首先是前端传来的字符串“小明通过扫码向你付款100000.566元”其中昵称和金额不是固定的,其他是固定的。
于是便考虑使用“通过扫码向你付款”作为分割的标志:

     String string = "小明通过扫码向你付款通过扫码向你付款1.12元";String str = "通过扫码向你付款";String[] list = string.split(str);for(String res : list){System.out.println(res);}

使用String的split方法可以将原字符串依据str分割成多个字符串,其中源字符串中的str被替换成空的“”

打印出来是:

小明1.12元

然后可以直接对数组list的最后一项进行操作了,这里才是我需要的金额数据。然而问题就来了。。。。

     String strLast = list[l-1];System.out.println("strLast:" + strLast);   //1.12元,汉字占用4个字节,所以下面采用-4操作String str2 = strLast.substring(0, str.length()-4);System.out.println("金额:" + str2);

刚开始我是这么写的,是我的疏忽写错了的,然后运行一下,结果竟然也出来了,但是仔细一看,这里面有个问题,可以看到在使用截取最后一个字符串的时候,使用的是str,而不是strLast,很神奇吧。。。。。

按照正常的逻辑,应该是使用strLast操作截取的,但是写strLast之后,截取的金额只有整数位了,小数位丢失了,但是让我很费解的是,使用str.length()-4这个,竟然能正确的截取出来金额。。。。。。截取金额已经跟这个过滤字符串str已经没有任何关系了。。。。。。。

没找到原因,那就先这么用着吧,毕竟安卓那边要调试借口了,就先这样用着了。。。。。。。

今天早上来了之后,感觉那样写肯定是有问题的,于是我便换个数据测,之前的金额都是用xx.xx测的,都没问题,于是直接上10000000,果然出错了,只能输出四位:1000

昨天查资料的时候查到关于正则表达式的,但是只能识别整数,没看到小数的,然后今天偶然翻到大佬自己写的提取数据的方法,看完之后,发现这个就是我想实现的效果,于是开始复制粘贴。。。。。。

下面贴出来具体的代码:

import java.util.regex.Matcher;
import java.util.regex.Pattern;public class NumberUtil {public static void main(String[] args) {String string = "10000.5689元";System.out.println(getNumber(string));}public static String getNumber(String str){// 控制正则表达式的匹配行为的参数(小数)Pattern p = Pattern.compile("(\\d+\\.\\d+)");//Matcher类的构造方法也是私有的,不能随意创建,只能通过Pattern.matcher(CharSequence input)方法得到该类的实例. Matcher m = p.matcher(str);//m.find用来判断该字符串中是否含有与"(\\d+\\.\\d+)"相匹配的子串if (m.find()) {//如果有相匹配的,则判断是否为null操作//group()中的参数:0表示匹配整个正则,1表示匹配第一个括号的正则,2表示匹配第二个正则,在这只有一个括号,即1和0是一样的str = m.group(1) == null ? "" : m.group(1);} else {//如果匹配不到小数,就进行整数匹配p = Pattern.compile("(\\d+)");m = p.matcher(str);if (m.find()) {//如果有整数相匹配str = m.group(1) == null ? "" : m.group(1);} else {//如果没有小数和整数相匹配,即字符串中没有整数和小数,就设为空str = "";}}return str;}
}

这是第一个版本,对于我使用来说足够用了,因为我截取之后,对“xxxx元”操作提取金额数据,里面只有一个数字串,和一个中文汉字。

升级版的代码是可以提取一个字符串中的多个数值段:
比如字符串小明hhhh100通过扫码向你付款通过扫码向你付款通过扫码向你付款1.12和100000hh2.50元
输出数据:100,1.12,100000,2.50

 public static String getNumber(String str){//先判断有没有整数,如果没有整数那就肯定就没有小数Pattern p = Pattern.compile("(\\d+)");Matcher m = p.matcher(str);String result = "";if (m.find()) {Map<Integer, String> map = new TreeMap<>();Pattern p2 = Pattern.compile("(\\d+\\.\\d+)");m = p2.matcher(str);//遍历小数部分while (m.find()) {result = m.group(1) == null ? "" : m.group(1);int i = str.indexOf(result);String s = str.substring(i, i + result.length());map.put(i, s);//排除小数的整数部分和另一个整数相同的情况下,寻找整数位置出现错误的可能,还有就是寻找重复的小数// 例子中是排除第二个345.56时第一个345.56产生干扰和寻找整数345的位置时,前面的小数345.56会干扰str = str.substring(0, i) + str.substring(i + result.length());}//遍历整数Pattern p3 = Pattern.compile("(\\d+)");m = p3.matcher(str);while (m.find()) {result = m.group(1) == null ? "" : m.group(1);int i = str.indexOf(result);//排除jia567.23.23在第一轮过滤之后留下来的jia.23对整数23产生干扰if (String.valueOf(str.charAt(i - 1)).equals(".")) {//将这个字符串删除str = str.substring(0, i - 1) + str.substring(i + result.length());continue;}String s = str.substring(i, i + result.length());map.put(i, s);str = str.substring(0, i) + str.substring(i + result.length());}result = "";for (Map.Entry<Integer, String> e : map.entrySet()) {result += e.getValue() + ",";}result = result.substring(0, result.length()-1);} else {result = "";}System.out.println(result);//String[] split = result.split(",");//String resultRtr = split[split.length-1];//return resultRtr;}

借鉴大佬的博客的出处:https://blog.csdn.net/tuesdayma/article/details/76412800

java利用正则表达式提取字符串中的整数和小数部分相关推荐

  1. qt中利用正则表达式提取字符串中的浮点数和整数

    当我们需要从一个字符串中提取数字时,可以用正则表达式来操作 QString str = "你的金额是: 0.22示范33^%zd卡兹克44是13.5x的5&ss"; QRe ...

  2. java 去除字符串中的英文_Java利用正则表达式去掉字符串中的英文

    利用正则表达式去掉字符串中的英文String str = "111,aaa,222,bbb"; Pattern p = Pattern.compile("[a-zA-z] ...

  3. 如何利用python提取字符串中的数字

    目录 一.isdigit() 函数 二.filter() 函数 三.提取一段字符串中的数字 四.匹配指定字符串开头的数字 参考资料 一.isdigit() 函数 isdigit() 函数是检测输入字符 ...

  4. 01. 利用正则表达式提取文章中的所有英文单词

    利用正则表达式提取文章中的所有英文单词 1.先创建一个Pattern对象, 模式对象,可以理解成一个正则表达式对象 Pattern pattern = Pattern.compile("[a ...

  5. java利用正则截取字符串中的数字

    java利用正则截取字符串中的数字 String str = "xxx第47297章33";String regex = "\\d*";Pattern p = ...

  6. 利用正则表达式提取网页中Table内的数据

    利用正则表达式提取网页中Table内的数据 using System; using System.Collections.Generic; using System.Linq; using Syste ...

  7. php 正则 尖括号,php使用正则表达式提取字符串中尖括号、小括号、中括号、大括号中的字符...

    PHP使用正则表达式提取字符串中尖括号<>.小括号().中括号[].大括号{}中的字符示例,需要的朋友可以参考下 代码如下: $str="你好(爱)[北京]{天安门}" ...

  8. java用正则表达式判断字符串中是否仅包含英文字母、数字和汉字_灵思致远Leansmall的博客-CSDN博客_java判断字符串只包含数字字母

    import java.util.regex.Matcher; import java.util.regex.Pattern;public class StrValidate {// 纯数字priva ...

  9. 正则表达式提取字符串中的手机号码

    正则表达式提取字符串中的手机号码 1.正则表达式提取思路 1.先提取出来11位的数字组合 2.再判断这11位的数字组合是否符合要求 2.要用到的正则表达式功能 a.match() 用于提取()里面的符 ...

最新文章

  1. stm32入门c语言下载,STM32入门C语言详解.docx
  2. SSM整合shiro权限框架
  3. 怎么在苹果Mac虚拟机上安装Win7
  4. SilverLight入门实例(一)
  5. cvs数据导入工具 oracle_为中国企业打造的研发项目管理工具ONES Project已支持Jira数据导入...
  6. mysql执行计划字段解释
  7. “生而强悍” vivo iQOO官宣3月1日发布
  8. jsp+servlet+jdbc实现对数据库的增删改查
  9. 微信无法连接到服务器怎么诊断网络【微信高级教程3】
  10. 大数据全样而非抽样原理_干货 | 大数据思维的十大核心原理(二)
  11. android字体颜色渐变色,实现TextView文本颜色渐变的骚操作
  12. 你没有权限修改该网络位置的文件
  13. 为什么很难统一量子力学与广义相对论?
  14. vant框架van-field
  15. 黑盒测试与白盒测试的定义与区别
  16. android 酷狗音乐 ip,“音乐+IP”融合模式 夯实酷狗音乐原创硬实力
  17. C语言——switch语句
  18. 连续创造OTT赛道新神话,论酷开科技的持久力
  19. mysql简单数据库共享_Mysql局域网共享
  20. 计算机二级准考证是哪套题,计算机二级word真题:制作准考证

热门文章

  1. mysql通过字段值查询表名
  2. 如何使用easywechat开发微信支付功能
  3. 淘宝近12亿条用户信息泄露,犯罪分子获利34万
  4. 设计师必备的导航网站
  5. #R语言# 生成随机数
  6. 什么是dB、dBm、dBc?
  7. 红外补光 vs白光补光
  8. html5页面拨打电话,5.添加页面/设置点击拨打电话
  9. CMD专业 :taskkill :::强制结束各种进程---查询端口号及占用端口号等
  10. 统计学的Python实现-012:峰度