截取一段字符串中两个指定字符串之间的字符串
package Servlet;
import java.util.Arrays;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* 截取指定两个字符串之间的字符串
* 并且进行判断得出的数量是否正确
* @author 李
*
*/
public class Substr {
public static void main(String[] args) {
String str = "{,'result':{,'result':{,'baseOrderInfo':{,'id':1624712,'orderNo':'737H378202'}}}";
int count=0;
int count1 = 0;
String Findstr = "':";
Pattern pattern= Pattern.compile(",'(.*?)':");//提取指定字符串之间的字符串
// String [] result = patten.split(str);
// System.err.println(Arrays.toString(result));
Matcher matcher = pattern.matcher(str);
while(matcher.find()) {
count++;
System.out.println(matcher.group(1));
}
System.out.println("获取到的字符串个数:"+count);
int origialLength = str.length();
str = str.replace(Findstr, "");
int nowLength = str.length();
count1= origialLength-nowLength;
System.out.println("replace方法得出应该获取到的字符串个数:"+count1/2);
}
}
上述代码中使用到的函数解析如下:java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包。它包括两个类:Pattern和Matcher Pattern 一个Pattern是一个正则表达式经编译后的表现模式。 Matcher 一个Matcher对象是一个状态机器,它依据Pattern对象做为匹配模式对字符串展开匹配检查。 首先一个Pattern实例订制了一个所用语法与PERL的类似的正则表达式经编译后的模式,然后一个Matcher实例在这个给定的Pattern实例的模式控制下进行字符串的匹配工作。
捕获组概念:
Pattern 类:
pattern 对象是一个正则表达式的编译表示。Pattern 类没有公共构造方法。要创建一个 Pattern 对象,你必须首先调用其公共静态编译方法,它返回一个 Pattern 对象。该方法接受一个正则表达式作为它的第一个参数。
Matcher 类:
Matcher 对象是对输入字符串进行解释和匹配操作的引擎。与Pattern 类一样,Matcher 也没有公共构造方法。你需要调用 Pattern 对象的 matcher 方法来获得一个 Matcher 对象。
Pattern和Matcher对象的创建
由于String类的功能有限,所以我们经常需要构建功能强大的正则表达式对象。通过Pattern.compile()方法来根据传入的String类型的正则表达式生成Pattern对象,然后把需要检索的字符串传入Pattern类的matcher方法生成Matcher对象,Matcher中提供了大量的方法满足我们的需求。Pattern对象与Matcher对象的创建过程如下:
String str = "\\d+";//string类型的正则表达式
Pattern p = Pattern.compile("str");//传入string类型的正则表达式到pattern的compile方法中生成pattern对象
String str1 = "123456";//需要检索的字符串
Matcher m = p.matcher(str1);//生成matcher对象
Matcher对象的方法以及使用:
matches:判断整个字符串是否都匹配正则表达式
lookingAt:从字符串的开头判断是否匹配正则表达式但可以不用整个都匹配
find:像迭代器那样向前遍历字符串,查找是否有匹配字符串片段。该方法还有一个重载的方法,可以传入一个索引值,即从该索引位置起查找是否有匹配的
group:当没有参数时返回前一次匹配成功的字符串(匹配整个正则表达式),由于一个正则表达式可以有包含多个括号,即拥有多个组,所以该方法可以传入一个数字,来返回匹配上某个组的字符串,当传入的数字为0时与未传参一样
groupCount:返回该正则表达式总共有可以分成多少组
start:返回先前匹配上的字符串的起始位置的索引值
end:返回先前匹配上的字符串的最后位置的索引值加一
replaceFirst、replaceAll:将匹配上的字符串的第一个、所有替换成指定的字符串
appendReplacement:这个方法会对字符串进行渐进式的替换,并将替换后的字符串通过指定的StringBuffer对象拼接起来
appendTail:通常用来结合上一个方法来使用,当替换了多次之后可以调用这个方法将后面没有被替换的字符串复制到StringBuffer中
reset:可以将现有的Matcher对象应用于一个新的字符串
例子1:这里我搞不懂为什么m.group(0)跟m.group(1)是一样的输出结果
==================分割线,我懂了
原来这个表达式被分为了三个组!!!组1就是代表全部表达式刚好跟组0定义相同。再加一个括号将整个表达式括起来就会出现组0=组1=组2的情况出现。
String s = "abc ABC Hello world\n" +
"abc ABC hh hh1\n";
Matcher m = Pattern.compile("(?m)((\\S+)\\s+(\\S+))$").matcher(s);
//1)(?m)表示按照多行模式每次提取一行进行匹配;
//2)\S+表示匹配一个或多个非空白符;
//3)\s+表示匹配一个或多个空白符(包括空格、tab、换行、换页和回车);
//4)$表示从靠近行尾的地方取数据,表示一行的末尾。
while (m.find()) {
for (int i = 0; i < m.groupCount(); i++)
System.out.print("[" + m.group(i) + "]");
System.out.println();
}/* output
[Hello world][Hello world][Hello]
[hh hh1][hh hh1][hh]
*/
例子2:
String s = "Hello world 47";
Matcher m = Pattern.compile("[a-zA-Z]").matcher(s);
System.out.println(m.replaceFirst("*"));
m = Pattern.compile("[a-zA-Z]").matcher(s);
System.out.println(m.replaceAll("*"));
m = Pattern.compile("[a-zA-Z]").matcher(s);
StringBuffer sb = new StringBuffer();
int i = 0;
while (m.find())
m.appendReplacement(sb, i++ + "");
System.out.println(sb);
m.appendTail(sb);
System.out.println(sb);
/* output
*ello world 47
***** ***** 47
01234 56789
01234 56789 47
*/
由此需要温习正则表达式的使用:
正则表达式实例
一个字符串其实就是一个简单的正则表达式,例如 Hello World 正则表达式匹配 “Hello World” 字符串。
**.(点号)**也是一个正则表达式,它匹配任何一个字符如:“a” 或 “1”。
下表列出了一些正则表达式的实例及描述:
正则表达式 描述
this is text
匹配字符串 "this is text"
this\s+is\s+text
注意字符串中的 \s+。
匹配单词 "this" 后面的 \s+ 可以匹配多个空格,之后匹配 is 字符串,再之后 \s+ 匹配多个空格然后再跟上 text 字符串。
可以匹配这个实例:this is text
^\d+(\.\d+)?
^ 定义了以什么开始
\d+ 匹配一个或多个数字
? 设置括号内的选项是可选的
\. 匹配 "."
可以匹配的实例:"5", "1.5" 和 "2.21"。
捕获组概念:
从正则表达式左侧开始,每出现一个左括号"("记做一个分组,分组编号从 1 开始。0 代表整个表达式。
"(\\D*)(\\d+)(.*)"//三个捕获组,0代表整个表达式
上一篇: 数据结构(三)二叉树及存储结构
下一篇: 查找字段中,指定字符串之间的字符串