s=a*a+2*a*b+b*b 已经是一个赋值表达式了,把表达式a*a+2*a*b+b*b的运算结果赋给s。
为信丰等地区用户提供了全套网页设计制作服务,及信丰网站建设行业解决方案。主营业务为网站建设、成都网站制作、信丰网站设计,以传统方式定制建设网站,并提供域名空间备案等一条龙服务,秉承以专业、用心的态度为用户提供真诚的服务。我们深信只要达到每一位用户的要求,就会得到认可,从而选择与我们长期合作。这样,我们也可以走得更远!
import java.util.Collections;
import java.util.Stack;
public class Calculator {
private StackString postfixStack = new StackString();//后缀式栈
private StackCharacter opStack = new StackCharacter();//运算符栈
private int [] operatPriority = new int[] {0,3,2,1,-1,1,0,2};//运用运算符ASCII码-40做索引的运算符优先级
public static void main(String[] args) {
System.out.println(5+12*(3+5)/7.0);
Calculator cal = new Calculator();
String s = "5+12*(3+5)/7";
double result = cal.calculate(s);
System.out.println(result);
}
/**
* 按照给定的表达式计算
* @param expression 要计算的表达式例如:5+12*(3+5)/7
* @return
*/
public double calculate(String expression) {
StackString resultStack = new StackString();
prepare(expression);
Collections.reverse(postfixStack);//将后缀式栈反转
String firstValue ,secondValue,currentValue;//参与计算的第一个值,第二个值和算术运算符
while(!postfixStack.isEmpty()) {
currentValue = postfixStack.pop();
if(!isOperator(currentValue.charAt(0))) {//如果不是运算符则存入操作数栈中
resultStack.push(currentValue);
} else {//如果是运算符则从操作数栈中取两个值和该数值一起参与运算
secondValue = resultStack.pop();
firstValue = resultStack.pop();
String tempResult = calculate(firstValue, secondValue, currentValue.charAt(0));
resultStack.push(tempResult);
}
}
return Double.valueOf(resultStack.pop());
}
/**
* 数据准备阶段将表达式转换成为后缀式栈
* @param expression
*/
private void prepare(String expression) {
opStack.push(',');//运算符放入栈底元素逗号,此符号优先级最低
char[] arr = expression.toCharArray();
int currentIndex = 0;//当前字符的位置
int count = 0;//上次算术运算符到本次算术运算符的字符的长度便于或者之间的数值
char currentOp ,peekOp;//当前操作符和栈顶操作符
for(int i=0;iarr.length;i++) {
currentOp = arr[i];
if(isOperator(currentOp)) {//如果当前字符是运算符
if(count 0) {
postfixStack.push(new String(arr,currentIndex,count));//取两个运算符之间的数字
}
peekOp = opStack.peek();
if(currentOp == ')') {//遇到反括号则将运算符栈中的元素移除到后缀式栈中直到遇到左括号
while(opStack.peek() != '(') {
postfixStack.push(String.valueOf(opStack.pop()));
}
opStack.pop();
} else {
while(currentOp != '(' peekOp != ',' compare(currentOp,peekOp) ) {
postfixStack.push(String.valueOf(opStack.pop()));
peekOp = opStack.peek();
}
opStack.push(currentOp);
}
count = 0;
currentIndex = i+1;
} else {
count++;
}
}
if(count 1 || (count == 1 !isOperator(arr[currentIndex]))) {//最后一个字符不是括号或者其他运算符的则加入后缀式栈中
postfixStack.push(new String(arr,currentIndex,count));
}
while(opStack.peek() != ',') {
postfixStack.push(String.valueOf( opStack.pop()));//将操作符栈中的剩余的元素添加到后缀式栈中
}
}
/**
* 判断是否为算术符号
* @param c
* @return
*/
private boolean isOperator(char c) {
return c == '+' || c == '-' || c == '*' || c == '/' || c == '(' ||c == ')';
}
/**
* 利用ASCII码-40做下标去算术符号优先级
* @param cur
* @param peek
* @return
*/
public boolean compare(char cur,char peek) {// 如果是peek优先级高于cur,返回true,默认都是peek优先级要低
boolean result = false;
if(operatPriority[(peek)-40] = operatPriority[(cur) - 40]) {
result = true;
}
return result;
}
/**
* 按照给定的算术运算符做计算
* @param firstValue
* @param secondValue
* @param currentOp
* @return
*/
private String calculate(String firstValue,String secondValue,char currentOp) {
String result = "";
switch(currentOp) {
case '+':
result = String.valueOf(ArithHelper.add(firstValue, secondValue));
break;
case '-':
result = String.valueOf(ArithHelper.sub(firstValue, secondValue));
break;
case '*':
result = String.valueOf(ArithHelper.mul(firstValue, secondValue));
break;
case '/':
result = String.valueOf(ArithHelper.div(firstValue, secondValue));
break;
}
return result;
}
}
public class ArithHelper {
// 默认除法运算精度
private static final int DEF_DIV_SCALE = 16;
// 这个类不能实例化
private ArithHelper() {
}
/**
* 提供精确的加法运算。
*
* @param v1 被加数
* @param v2 加数
* @return 两个参数的和
*/
public static double add(double v1, double v2) {
java.math.BigDecimal b1 = new java.math.BigDecimal(Double.toString(v1));
java.math.BigDecimal b2 = new java.math.BigDecimal(Double.toString(v2));
return b1.add(b2).doubleValue();
}
public static double add(String v1, String v2) {
java.math.BigDecimal b1 = new java.math.BigDecimal(v1);
java.math.BigDecimal b2 = new java.math.BigDecimal(v2);
return b1.add(b2).doubleValue();
}
/**
* 提供精确的减法运算。
*
* @param v1 被减数
* @param v2 减数
* @return 两个参数的差
*/
public static double sub(double v1, double v2) {
java.math.BigDecimal b1 = new java.math.BigDecimal(Double.toString(v1));
java.math.BigDecimal b2 = new java.math.BigDecimal(Double.toString(v2));
return b1.subtract(b2).doubleValue();
}
public static double sub(String v1, String v2) {
java.math.BigDecimal b1 = new java.math.BigDecimal(v1);
java.math.BigDecimal b2 = new java.math.BigDecimal(v2);
return b1.subtract(b2).doubleValue();
}
/**
* 提供精确的乘法运算。
*
* @param v1
* 被乘数
* @param v2
* 乘数
* @return 两个参数的积
*/
public static double mul(double v1, double v2) {
java.math.BigDecimal b1 = new java.math.BigDecimal(Double.toString(v1));
java.math.BigDecimal b2 = new java.math.BigDecimal(Double.toString(v2));
return b1.multiply(b2).doubleValue();
}
public static double mul(String v1, String v2) {
java.math.BigDecimal b1 = new java.math.BigDecimal(v1);
java.math.BigDecimal b2 = new java.math.BigDecimal(v2);
return b1.multiply(b2).doubleValue();
}
/**
* 提供(相对)精确的除法运算,当发生除不尽的情况时,精确到 小数点以后10位,以后的数字四舍五入。
*
* @param v1
* 被除数
* @param v2
* 除数
* @return 两个参数的商
*/
public static double div(double v1, double v2) {
return div(v1, v2, DEF_DIV_SCALE);
}
public static double div(String v1, String v2) {
java.math.BigDecimal b1 = new java.math.BigDecimal(v1);
java.math.BigDecimal b2 = new java.math.BigDecimal(v2);
return b1.divide(b2, DEF_DIV_SCALE, java.math.BigDecimal.ROUND_HALF_UP).doubleValue();
}
/**
* 提供(相对)精确的除法运算。当发生除不尽的情况时,由scale参数指 定精度,以后的数字四舍五入。
*
* @param v1 被除数
* @param v2 除数
* @param scale 表示表示需要精确到小数点以后几位。
* @return 两个参数的商
*/
public static double div(double v1, double v2, int scale) {
if (scale 0) {
throw new IllegalArgumentException("The scale must be a positive integer or zero");
}
java.math.BigDecimal b1 = new java.math.BigDecimal(Double.toString(v1));
java.math.BigDecimal b2 = new java.math.BigDecimal(Double.toString(v2));
return b1.divide(b2, scale, java.math.BigDecimal.ROUND_HALF_UP).doubleValue();
}
/**
* 提供精确的小数位四舍五入处理。
*
* @param v 需要四舍五入的数字
* @param scale 小数点后保留几位
* @return 四舍五入后的结果
*/
public static double round(double v, int scale) {
if (scale 0) {
throw new IllegalArgumentException("The scale must be a positive integer or zero");
}
java.math.BigDecimal b = new java.math.BigDecimal(Double.toString(v));
java.math.BigDecimal one = new java.math.BigDecimal("1");
return b.divide(one, scale, java.math.BigDecimal.ROUND_HALF_UP).doubleValue();
}
public static double round(String v, int scale) {
if (scale 0) {
throw new IllegalArgumentException("The scale must be a positive integer or zero");
}
java.math.BigDecimal b = new java.math.BigDecimal(v);
java.math.BigDecimal one = new java.math.BigDecimal("1");
return b.divide(one, scale, java.math.BigDecimal.ROUND_HALF_UP).doubleValue();
}
}
Java是面向表达式的语言,Java中一个简单表达式可以是下面任意一种:● 常量:7、false。● 单引号括起来的字符字面常量:'A'、'3'。● 双引号括起来的字符串字面常量:"foo"、"Java"。● 任何正确声明的变量名:myString、x。● 任何用Java二元运算符(本章稍后将详细讨论)连接起来的两个上述类型的表达式:x+2。● 任何用Java一元运算符(本章稍后将详细讨论)修饰的单个上述类型的表达式:i++。● 任何用小括号括起来的上述类型的表达式:(x+2)。以及另外一些与本书后面将要学到的对象有关的表达式类型。无论多么复杂的表达式都可以由不同类型的简单表达式和括号嵌套组合而成,例如:((((4/x) + y) * 7) + z)。2.9.1 算术运算符 Java语言提供了许多基本的算术运算符,如表2-1所示。表2-1 Java算术运算符运算符描 述+加法-减法*乘法/除法%求余(%左边的操作数除以右边的
操作数所得到的余数,例如10%3=1)+和-运算符也可作为一元运算符用于表示正负数:-3.7、+42。除了简单赋值运算符=,还有许多特定的复合赋值运算符,这些运算符将变量赋值和算术操作合并在一起,如表2-2所示。表2-2 Java复合赋值运算符运算符描 述+=a+=b等价于a=a+b-=a-=b等价于a=a-b*=a*=b等价于a=a*b/=a/=b等价于a=a/b%=a%=b等价于a=a%b最后要介绍的两个算术运算符是一元递增运算符(++)和一元递减运算符(--),用于将整数变量的值加1或减1,或者将浮点数变量的值加1.0或减1.0。称它们为一元运算符是因为它们用于单个变量,而前面讨论的二元运算符则连接两个表达式的值。一元递增运算符和一元递减运算符也可用于将字符变量在Unicode序列中向前或向后移动一个字符位置。例如,在下面的代码片段中,字符变量c的值从'e'递增为'f':递增和递减运算符可以以前缀或者后缀方式使用。如果运算符放在操作数之前(前缀模式),变量的递增或递减操作将在更新后的变量值被用于任何由它构成的赋值操作之前执行。例如,考虑下面的使用前缀递增运算符的代码片段,假设a和b在程序前面已经声明为int变量:上述代码执行后,变量a的值是2,变量b的值也是2。这是因为在第二行中变量a的递增(从1到2)发生在它的值赋给b之前。因此这行代码在逻辑上等价于下面两行代码: 另一方面,如果运算符放在操作数之后(后缀模式),递增或递减操作发生在原来的变量值被用于任何由它构成的赋值操作之后。看一下以后缀方式使用递增运算符的相同代码片段:上述代码执行后,变量b的值是1,而变量a的值是2。这是因为在第二行中变量a的递增(从1到2)发生在它的值赋给b之后。因此这行代码在逻辑上等价于下面两行代码:下面是一个稍微复杂一点例子,请阅读附加的注释以确保你能够明白x最终是如何被赋值为10的:稍后将会看到,递增和递减运算符通常和循环一起使用。2.9.2 关系和逻辑运算符逻辑表达式以指定的方式比较两个(简单或者复杂)表达式exp1和exp2,决议出一个boolean值true或者false。 Java提供了表2-3所示的关系运算符来创建逻辑表达式。表2-3 Java关系运算符运算符描 述exp1==exp2如果exp1等于exp2,值为true(注意使用双等号测试相等性)exp1exp2如果exp1大于exp2,值为trueexp1=exp2如果exp1大于等于exp2,值为trueexp1exp2如果exp1小于exp2,值为trueexp1=exp2如果exp1小于等于exp2,值为trueexp1!=exp2如果exp1不等于exp2,值为true!exp如果exp为false值为true,如果exp为true值为false除了关系运算符,Java还提供了用于组合/修饰逻辑表达式的逻辑运算符。表2-4列出了最常用的逻辑运算符。表2-4 Java逻辑运算符运算符描 述exp1exp2逻辑“与”,仅当exp1和exp2都为true时复合表达式值为trueexp1||exp2逻辑“或”,exp1或exp2值为true时复合表达式值为true!exp逻辑“非”,将逻辑表达式的值从true切换到false,反之亦然下面这个例子用逻辑“与”运算符来编程实现逻辑表达式“如果x大于2.0且y不等于4.0”:逻辑表达式常用于流程控制结构,本章稍后将进行讨论。2.9.3 表达式求值和运算符优先级如同本章前面提到的那样,任何复杂的表达式都可以用分层嵌套的小括号构成,例如(((8 * (y + z)) + y) x)。编译器通常按照从内到外,从左到右的顺序对这样的表达式求值。假设x、y、z按照下面的方式声明并初始化:下面的赋值语句右边的表达式:将像下面这样逐步求值:没有小括号时,根据运算符用于表达式求值的顺序,某些运算符具有高于其他运算符的优先级。例如,乘除法先于加减法执行。通过使用小括号可以强制改变运算符的优先级,括号内的运算符比括号外的先执行。考虑下面的代码片段:代码的第一行没有使用括号,乘法操作比加法操作先执行,因此整个表达式的值为2+12=14,就像我们将表达式明确地写成2+(3*4)一样,当然这样做没有必要。 在代码的第二行,括号被明确地放在操作2+3两边,因此加法操作将首先执行,然后求和结果乘以4作为整个表达式的值,即5*4=20。回到前面的例子注意到和!=运算符优先级高于运算符,因此可以去掉嵌套的括号而变成下面这样:然而,额外的括号并不会对代码造成伤害,事实上它可以使表达式的目的更加清楚。2.9.4 表达式类型表达式类型是表达式最终求值结果的Java类型。例如给定下面的代码片段:表达式(x 2.0) (y != 4.0)求值结果为true,因此表达式(x 2.0) (y != 4.0)称为boolean型表达式。在下面的代码片段中:表达式((8 * (y + z)) + y) * x求值结果为42,因此表达式((8 * (y + z)) + y) * x称为整型表达式。
这是我的blog上面的详细介绍。配中文字符的正则表达式: [\u4e00-\u9fa5]
匹配双字节字符(包括汉字在内):[^\x00-\xff]
应用:计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)
String.prototype.len=function(){return this.replace([^\x00-\xff]/g,"aa").length;}
匹配空行的正则表达式:\n[\s| ]*\r
匹配HTML标记的正则表达式:/(.*).*\/\1|(.*) \//
匹配首尾空格的正则表达式:(^\s*)|(\s*$)
应用:javascript中没有像vbscript那样的trim函数,我们就可以利用这个表达式来实现,如下:
String.prototype.trim = function()
{
return this.replace(/(^\s*)|(\s*$)/g, "");
}
利用正则表达式分解和转换IP地址:
下面是利用正则表达式匹配IP地址,并将IP地址转换成对应数值的Javascript程序:
function IP2V(ip)
{
re=/(\d+)\.(\d+)\.(\d+)\.(\d+)/g //匹配IP地址的正则表达式
if(re.test(ip))
{
return RegExp.$1*Math.pow(255,3))+RegExp.$2*Math.pow(255,2))+RegExp.$3*255+RegExp.$4*1
}
else
{
throw new Error("Not a valid IP address!")
}
}
不过上面的程序如果不用正则表达式,而直接用split函数来分解可能更简单,程序如下:
var ip="10.100.20.168"
ip=ip.split(".")
alert("IP值是:"+(ip[0]*255*255*255+ip[1]*255*255+ip[2]*255+ip[3]*1))
匹配Email地址的正则表达式:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*
匹配网址URL的正则表达式:http://([\w-]+\.)+[\w-]+(/[\w- ./?%=]*)?
利用正则表达式去除字串中重复的字符的算法程序:[注:此程序不正确,原因见本贴回复]
var s="abacabefgeeii"
var s1=s.replace(/(.).*\1/g,"$1")
var re=new RegExp("["+s1+"]","g")
var s2=s.replace(re,"")
alert(s1+s2) //结果为:abcefgi
我原来在CSDN上发贴寻求一个表达式来实现去除重复字符的方法,最终没有找到,这是我能想到的最简单的实现方法。思路是使用后向引用取出包括重复的字符,再以重复的字符建立第二个表达式,取到不重复的字符,两者串连。这个方法对于字符顺序有要求的字符串可能不适用。
得用正则表达式从URL地址中提取文件名的javascript程序,如下结果为page1
s=" "
s=s.replace(/(.*\/){0,}([^\.]+).*/ig,"$2")
alert(s)
利用正则表达式限制网页表单里的文本框输入内容:
用正则表达式限制只能输入中文:onkeyup="value=value.replace(/[^\u4E00-\u9FA5]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\u4E00-\u9FA5]/g,''))"
用正则表达式限制只能输入全角字符: onkeyup="value=value.replace(/[^\uFF00-\uFFFF]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\uFF00-\uFFFF]/g,''))"
用正则表达式限制只能输入数字:onkeyup="value=value.replace(/[^\d]/g,'') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))"
用正则表达式限制只能输入数字和英文:onkeyup="value=value.replace(/[\W]/g,'') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))" 出处:蓝色理想
前一段时间写了2段EmEditor的宏,用来统计代码行数和简单的规约检查,稍微整理一下,
下面是从EmEditor的QA的提取的实例:双引号包含的字符串
strings surrounded by double-quotation marks
“.*?” [ ]包含的字符串
strings surrounded by [ ]
\[[^\[]*?\] 变量名
variable names
[a-zA-Z_][a-zA-Z_0-9]* IP 地址
IP addresses
([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3}) 网页地址
URL
(\S+)://([^:/]+)(:(\d+))?(/[^#\s]*)(#(\S+))? 各行Tab以后的文字列
lines followed by a tab
\t.*$ 平仮名 ひらがな
Hiragana
[\x{3041}-\x{309e}] 全角片仮名 全角カタカナ
Full-width Katakana
[\x{309b}-\x{309c}\x{30a1}-\x{30fe}] 半角仮名 半角カナ
Half-width Kana
[\x{ff61}-\x{ff9f}] 中日韩 汉字
CJK ideographs
[\x{3400}-\x{9fff}\x{f900}-\x{fa2d}] 中日韩 汉字符号
CJK ideograph marks
[\x{3000}-\x{3037}] 韩国字符
Hangul
[\x{1100}-\x{11f9}\x{3131}-\x{318e}\x{ac00}-\x{d7a3}] 行头插入 //
Insert // at start of lines
Find: ^
Replace with: // 删除行头 //
Remove // at end of lines
Find: ^//
Replace: 删除行后的空白文字(包含空格和制表位 Space+Tab)
Remove trailing whitespaces
Find: \s+?$
Replace with: 将(abc)替换为[abc]
Replace (abc) with [abc]
Find: \((.*?)\)
Replace: \[\1\] 将H3 …替换为H4 …
Replace H3 … with H4 …
Find: H3(.*?)
Replace: H4\1 将9/13/2003替换为2003年9月13日
Replace 9/13/2003 with 2003.9.13
Find: ([0-9]{1,2})/([0-9]{1,2})/([0-9]{2,4})
Replace: \3年\1月\2日 将字母a-z替换为大写字母
Uppercase characters from a to z
Find: [a-z]
Replace: \U\0 首字母大写
Capitalize all words
Find: ([a-zA-Z])([a-zA-Z]*)
Replace: \U\1\L\2
\S{6,18}
以下是常用的正则表达式希望能帮到你。
size=12px]1。^\d+$//匹配非负整数(正整数 + 0)
2。^[0-9]*[1-9][0-9]*$//匹配正整数
3。^((-\d+)|(0+))$//匹配非正整数(负整数 + 0)
4。^-[0-9]*[1-9][0-9]*$//匹配负整数
5。^-?\d+$//匹配整数
6。^\d+(\.\d+)?$//匹配非负浮点数(正浮点数 + 0)
7。^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$//匹配正浮点数
8。^((-\d+(\.\d+)?)|(0+(\.0+)?))$//匹配非正浮点数(负浮点数 + 0)
9。^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$//匹配负浮点数
10。^(-?\d+)(\.\d+)?$//匹配浮点数
11。^[A-Za-z]+$//匹配由26个英文字母组成的字符串
12。^[A-Z]+$//匹配由26个英文字母的大写组成的字符串
13。^[a-z]+$//匹配由26个英文字母的小写组成的字符串
14。^[A-Za-z0-9]+$//匹配由数字和26个英文字母组成的字符串
15。^\w+$//匹配由数字、26个英文字母或者下划线组成的字符串
16。^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$//匹配email地址
17。^[a-zA-z]+://匹配(\w+(-\w+)*)(\.(\w+(-\w+)*))*(\?\S*)?$//匹配url
18。匹配中文字符的正则表达式: [\u4e00-\u9fa5]
19。匹配双字节字符(包括汉字在内):[^\x00-\xff]
20。应用:计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)
String.prototype.len=function(){return this.replace([^\x00-\xff]/g,"aa").length;}
21。匹配空行的正则表达式:\n[\s| ]*\r
22。匹配HTML标记的正则表达式:/(.*).*\/\1|(.*) \//
23。匹配首尾空格的正则表达式:(^\s*)|(\s*$)
Java中正则表达式匹配的语法规则:
以下是整理出来的Java下运用正则表达式实现匹配的程序案例,代码如下:
package org.luosijin.test;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* 正则表达式
* @version V5.0
* @author Admin
* @date 2015-7-25
*/
public class Regex {
/**
* @param args
* @author Admin
* @date 2015-7-25
*/
public static void main(String[] args) {
Pattern pattern = Pattern.compile("b*g");
Matcher matcher = pattern.matcher("bbg");
System.out.println(matcher.matches());
System.out.println(pattern.matches("b*g","bbg"));
//验证邮政编码
System.out.println(pattern.matches("[0-9]{6}", "200038"));
System.out.println(pattern.matches("//d{6}", "200038"));
//验证电话号码
System.out.println(pattern.matches("[0-9]{3,4}//-?[0-9]+", "02178989799"));
getDate("Nov 10,2009");
charReplace();
//验证身份证:判断一个字符串是不是身份证号码,即是否是15或18位数字。
System.out.println(pattern.matches("^//d{15}|//d{18}$", "123456789009876"));
getString("D:/dir1/test.txt");
getChinese("welcome to china,江西奉新,welcome,你!");
validateEmail("luosijin123@163.com");
}
/**
* 日期提取:提取出月份来
* @param str
* @author Admin
* @date 2015-7-25
*/
public static void getDate(String str){
String regEx="([a-zA-Z]+)|//s+[0-9]{1,2},//s*[0-9]{4}";
Pattern pattern = Pattern.compile(regEx);
Matcher matcher = pattern.matcher(str);
if(!matcher.find()){
System.out.println("日期格式错误!");
return;
}
System.out.println(matcher.group(1)); //分组的索引值是从1开始的,所以取第一个分组的方法是m.group(1)而不是m.group(0)。
}
/**
* 字符替换:本实例为将一个字符串中所有包含一个或多个连续的“a”的地方都替换成“A”。
*
* @author Admin
* @date 2015-7-25
*/
public static void charReplace(){
String regex = "a+";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher("okaaaa LetmeAseeaaa aa booa");
String s = matcher.replaceAll("A");
System.out.println(s);
}
/**
* 字符串提取
* @param str
* @author Admin
* @date 2015-7-25
*/
public static void getString(String str){
String regex = ".+/(.+)$";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(str);
if(!matcher.find()){
System.out.println("文件路径格式不正确!");
return;
}
System.out.println(matcher.group(1));
}
/**
* 中文提取
* @param str
* @author Admin
* @date 2015-7-25
*/
public static void getChinese(String str){
String regex = "[//u4E00-//u9FFF]+";//[//u4E00-//u9FFF]为汉字
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(str);
StringBuffer sb = new StringBuffer();
while(matcher.find()){
sb.append(matcher.group());
}
System.out.println(sb);
}
/**
* 验证Email
* @param email
* @author Admin
* @date 2015-7-25
*/
public static void validateEmail(String email){
String regex = "[0-9a-zA-Z]+@[0-9a-zA-Z]+//.[0-9a-zA-Z]+";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(email);
if(matcher.matches()){
System.out.println("这是合法的Email");
}else{
System.out.println("这是非法的Email");
}
}
}