java 中的字符串处理--正则表达式

最近在做一些支付报文处理工作,需要从各种各样的报文中提取需要的信息比如(金额,订单号。。。),每个渠道报文各式各样,想要写一个通用的提取逻辑,于是就回顾java正则表达式的用法。当然我们可以自己写一些算法,去提取这些字段,但对于简单的解析来说,亲自手写算法有点杀鸡用牛刀的感觉,而且正则表达式完全可以满足大部分的字符提取需求。好了闲话不多说,先列出正则表达式的常用语法:

  • \:表示下一个字符为特殊含义的字符例如:\d匹配数字
  • ^:表示匹配字符开始的位置例如:^#.*:匹配以#开头的所有字符
  • $:表示匹配字符结束位置例如:.*元$:匹配以元为结尾的字符
  • .:表示匹配所有字符
  • *:表示出现次数为0,或大于0次
  • +:表示出现次数为1或大于1次
  • ?:表示匹配0次或1次
  • {n}:标示与字符刚好匹配n次
  • {n,m}:标示至少匹配n次,最多匹配m次
  • [xyz]:字符集,匹配字符集中任意字符,例如:[abc] 匹配plan中的a
  • [^xyz]:反向字符集,相当与非运算,表示不在字符集中的字符
  • (pattern):子表达式,在java中我们自左向右取group: matcher.group(0);

下面列出一些常用的特殊字符及其含义:

  • \d:匹配数字,等效于[0-9]
  • \D:匹配非数字,等效于[^0-9]
  • \n:匹配换行符
  • \r:匹配回车符
  • \s:匹配空格或者换行符或者换页符,等效于[\f\n\r\t\v]
  • \S:匹配任何非空字符
  • \w:匹配任何字类字符,等效于[a-zA-Z0-9]
  • \W:匹配任何非字类字符

为了加深理解与运用,下面列出几个应用场景:

取出下面字符串中的金额:

#支出合计:33笔, 共10.00元
String temp = "#支出合计:33笔, 共10.00元";
        Pattern p = Pattern.compile("(\\d+\\.\\d+)");
        Matcher matcher = p.matcher(temp);
        if(matcher.find()){
            System.out.println(matcher.group(0));
            System.out.println(matcher.group(1));
        }

输出:10.00

发现成功的将报文中的金额识别出来,因此我们只需要将不同结构的报文中含有金额部分输入,就可以方便的输出金额了,简单的万金油....

时间: 2024-12-14 12:43:19

java 中的字符串处理--正则表达式的相关文章

java中判断字符串是否为数字的方法的几种方法

Java中判断字符串是否为数字的方法: 1.用JAVA自带的函数 public static boolean isNumeric(String str){ for (int i = 0; i < str.length(); i++){ System.out.println(str.charAt(i)); if (!Character.isDigit(str.charAt(i))){ return false; } } return true; } 2.用正则表达式 首先要import java.

java中String字符串的替换函数:replace与replaceAll的区别

例如有如下x的字符串 String x = "[kllkklk\\kk\\kllkk]";要将里面的“kk”替换为++,可以使用两种方法得到相同的结果 replace(CharSequence target, CharSequence replacement)       ——          x.replace("kk", "++") replaceAll(String regex, String replacement)       —— 

Java中的字符串常量池

最近做到一个题目: 问题:String str = new String("abc"),"abc"在内存中是怎么分配的?    答案是:堆,字符串常量区. 题目考查的为Java中的字符串常量池和JVM运行时数据区的相关概念."abc"为字面量对象,其存储在堆内存中.而字符串常量池则存储的是字符串对象的一个引用. Java中的字符串常量池 Java中字符串对象创建有两种形式,一种为字面量形式,如String str = "droid&qu

protobuf在java中的字符串化

最近由于项目需要,大致研究了一下protobuf的java使用.说实话,习惯了C++的protobuf,java用起来真别扭. 由于需要将protobuf序列化后,存入redis,而且redis没法直接存储非字符串的数据,所以我只能想办法将protobuf序列化成字符串. protobuf的java实现里,并没有直接序列化成String类型变量的方法,但是提供了toByteArray()方法,可以序列化成byte[]. 于是乎很容易想到可以这么做: byte[] raw_bytes = prot

Android学习笔记----Java中的字符串比较

用习惯了C#.C++,在做字符串比较时想当然地使用如下语句: 1 string str1 = "abcd", str2 = "abcd"; 2 if(str1==str2) 3 { 4 return true; 5 } 6 else 7 { 8 return false; 9 } 殊不知在Java中,两个String类型的变量,尽管字符相同,使用”==“进行比较,也会返回false. Java中进行字符串比较需采用String类型的equals方法: 1 Strin

JAVA中创建字符串的两种方式的区别

我们知道,通常在Java中创建一个字符串会有两种方式,通过双引号直接赋值和通过构造器来创建. String x = "abcd"; String y = new String("abcd"); 然而,这两种方式之间的区别是什么?分别应用于哪些情况,之前还不是很懂. 1.双引号的方式 String x = "abcd"; String y = "abcd"; System.out.println(x==y);//true Sys

Java中的字符串比较,按照使用习惯进行比较

java中的字符串比较一般可以采用compareTo函数,如果a.compareTo(b)返回的是小于0的数,那么说明a的unicode编码值小于b的unicode编码值. 但是很多情况下,我们开发一款app需要结合“国情”,比如在电话本中,我们希望“李四”排在“zhangsan”的前面,但是如果采用普通的compareTo函数的字符串比较的方式,那么“zhangsan”小于“李四”,由此造成了“zhangsan”的排序先于“李四”. 解决方式是采用java提供的 Collator类. 一.原理

为什么Java中的字符串是不可变的?

原文链接:https://www.programcreek.com/2013/04/why-string-is-immutable-in-java/ java字符串是不可变的.不可变类只是一个不能修改实例的类.实例创建时所有的信息都被初始化,并且信息不能被修改.不可变类有许多优点.本文总结了字符串为什么被设计成不可变的原因.这说明在记忆的角度不变性的概念,同步和数据结构. 1.字符串池的要求: 字符串池(字符串特定池)是方法区域中的一个特殊存储区域.当创建字符串时,如果字符串已经存在于池中,则将

转载:Java中的字符串常量池详细介绍

引用自:http://blog.csdn.net/langhong8/article/details/50938041 这篇文章主要介绍了Java中的字符串常量池详细介绍,JVM为了减少字符串对象的重复创建,其维护了一个特殊的内存,这段内存被成为字符串常量池或者字符串字面量池,需要的朋友可以参考下 Java中字符串对象创建有两种形式,一种为字面量形式,如String str = "droid";,另一种就是使用new这种标准的构造对象的方法,如String str = new Stri