「java正则表达式效率」java 正则性能
本篇文章给大家谈谈java正则表达式效率,以及java 正则性能对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
- 1、java的正则表达式有什么作用?
- 2、不是用java现有API(正则表达式和replace)对字符串的指定子串进行替换,要求考虑效率
- 3、用java正则表达式提取java程序中的注释
- 4、java正则表达式中,matches和find的效率问题
- 5、JAVA正则表达式,matcher.find和 matcher.matches的区别
java的正则表达式有什么作用?
//正则表达式,是用来匹配字符串的,即检查一定的格式,还能按格式进行分
//组,替换......
//举个简单的例子,检查一个字符串是否是IP地址类型的(192.168.0.101)。当
//然,下面的例子只是作初步的检查,即检查字符串是否为:1-3个数字接1
//个".",1-3个数字接1个".",1-3个数字接1个".",1-3个数字。
public class Test {
public static void main(String args[]){
String s="192.168.0.101";
String s2="1234.1232.123";
System.out.println(s.matches("[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}"));
System.out.println(s2.matches("[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}"));
}
}
//当然,正则表达式绝不是只能检查的,还可以将字符串进行分组,提取出你
//想要的部分
//其实,不用正则表达式,也可以编。但是,大多数情况下,正则表达式可以提
//高你编程的效率。
不是用java现有API(正则表达式和replace)对字符串的指定子串进行替换,要求考虑效率
/**
* 替换第一个
* @param oriStr 原始字符串
* @param regex 要替换的部分
* @param repStr 要替换成的字符串
* @return 替换后的字符串
*/
public static String replaceFirst(String oriStr, String regex,
String repStr) {
if (oriStr.lastIndexOf(regex) != -1) {
String[] strs = oriStr.split(regex);
StringBuffer sb = new StringBuffer();
sb.append(strs[0]);
sb.append(repStr);
for (int i = 1; i strs.length; i++) {
sb.append(strs[i]);
sb.append(regex);
}
return sb.toString().substring(0, sb.toString().length() - 1);
} else {
throw new RuntimeException("目标字符串中不包含要替换的字符串");
}
}
/**
* 替换所有
* @param oriStr 原始字符串
* @param regex 要替换的部分
* @param repStr 要替换成的字符串
* @return 替换后的字符串
*/
public static String replaceAll(String oriStr, String regex,
String repStr) {
if (oriStr.lastIndexOf(regex) != -1) {
String[] strs = oriStr.split(regex);
StringBuffer sb = new StringBuffer();
for (int i = 0; i strs.length; i++) {
sb.append(strs[i]);
sb.append(repStr);
}
return sb.toString().substring(0, sb.toString().length() - 1);
} else {
throw new RuntimeException("目标字符串中不包含要替换的字符串");
}
}
用java正则表达式提取java程序中的注释
正则的效率非常低,有很多不用正则的好方法:
一,示例 某java程序
比如说一个Test2.java,将其保存在C盘根目录下,代码内容如下
/**
* @author xxx
*
*/
public class Test2 {
/* main method */
public static void main(String[] args) {
//a
int a =5;
//b
int b =5;
//a+b
System.out.println(a+b);
}
}
二,提取注释程序,将所有注释放到一个List里面,最后打印输出:
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
public class Test {
private static final String javaFilePath = "C:/Test2.java";
public static void main(String[] args) throws IOException {
ListString comments = new ArrayListString();
BufferedReader bfr = new BufferedReader(new InputStreamReader(new FileInputStream(javaFilePath)));
String line=null;
while((line=bfr.readLine())!=null){
line = line.trim();
if(line.startsWith("//")){
comments.add(line);
}
else if(line.startsWith("/*")line.endsWith("*/")){
comments.add(line);
}else if(line.startsWith("/*")!line.endsWith("*/")){
StringBuffer multilineComment = new StringBuffer(line);
while((line=bfr.readLine())!=null){
line = line.trim();
multilineComment.append("\n").append(line);
if(line.endsWith("*/")){
comments.add(multilineComment.toString());
break;
}
}
}
}
bfr.close();
for(int i=0;icomments.size();i++){
System.out.println("第"+(i+1)+"处注释: ");
System.out.println(comments.get(i));
}
}
}
三,输出结果:
第1处注释:
/**
* @author xxx
*
*/
第2处注释:
/* main method */
第3处注释:
//a
第4处注释:
//b
第5处注释:
//a+b
java正则表达式中,matches和find的效率问题
你可以看下源码,匹配原理是一样的,没什么大区别。效率应该是一样的。匹配原则代码块如下。
this.hitEnd = false;
this.requireEnd = false;
from = from 0 ? 0 : from;
this.first = from;
this.oldLast = oldLast 0 ? from : oldLast;
for (int i = 0; i groups.length; i++)
groups[i] = -1;
acceptMode = anchor;
boolean result = parentPattern.matchRoot.match(this, from, text);
if (!result)
this.first = -1;
this.oldLast = this.last;
return result;
JAVA正则表达式,matcher.find和 matcher.matches的区别
1.find()方法是部分匹配,是查找输入串中与模式匹配的子串,如果该匹配的串有组还可以使用group()函数。
matches()是全部匹配,是将整个输入串与模式匹配,如果要验证一个输入的数据是否为数字类型或其他类型,一般要用matches()。
2.Pattern pattern= Pattern.compile(".*?,(.*)");
Matcher matcher = pattern.matcher(result);
if (matcher.find()) {
return matcher.group(1);
}
3.详解:
matches
public static boolean matches(String regex, CharSequence input)
编译给定正则表达式并尝试将给定输入与其匹配。
调用此便捷方法的形式
Pattern.matches(regex, input);
Pattern.compile(regex).matcher(input).matches() ;
如果要多次使用一种模式,编译一次后重用此模式比每次都调用此方法效率更高。
参数:
regex - 要编译的表达式
input - 要匹配的字符序列
抛出:
PatternSyntaxException - 如果表达式的语法无效
find
public boolean find()尝试查找与该模式匹配的输入序列的下一个子序列。
此方法从匹配器区域的开头开始,如果该方法的前一次调用成功了并且从那时开始匹配器没有被重置,则从以前匹配操作没有匹配的第一个字符开始。
如果匹配成功,则可以通过 start、end 和 group 方法获取更多信息。
matcher.start() 返回匹配到的子字符串在字符串中的索引位置.
matcher.end()返回匹配到的子字符串的最后一个字符在字符串中的索引位置.
matcher.group()返回匹配到的子字符串
返回:
当且仅当输入序列的子序列匹配此匹配器的模式时才返回 true。
java正则表达式效率的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于java 正则性能、java正则表达式效率的信息别忘了在本站进行查找喔。