在正则表达式中,有些符号有特殊意义(除了引号和@),故要使用符号直接量,必须加转移字符-反斜杠,即用\! 表示!号,如果记不住全部,可以在所以符号前加上\。不过某些字母加反斜杠后表示其它字符,如\t表示制表符,所以字母不要随便加反斜杠。
[a-zA-Z0-9]{6,8}貌似后面的不取作用,不过可以用xx.length来代替
修改 是因为test()不会全局索引的原因 在Java中可用
几个常用的正则表达式的方法
js:
1: .match() 返回值是一个数组,其中下表为零表示匹配文本,其余则表示子匹配文本(需加小括号)(在全局检索下,表示其它匹配项)
如果正则表示式中有g标记(标记i表示不区分大小写)则会全局检索,否则则会部分检索。
例子
“1 plus 2 =3”.match(/[0-9]+/g);返回结果为[“1”,”2”,”3”]
2: .search() 返回第一个匹配字符的位置,如果没有则返回-1,不能执行全局检索,姑会忽略g标志。
例子
“JavaScript”.search(/script/i); 返回结果为4
3:.split(delimiter,limit)返回一个字符串数组(join()是合并)。
“.3”.split(“.”)返回[“1”,”2”,”2”,”3”]
“1 2,3 4”.split(/[\s\,]/)返回[“1”,”2”,”2”,”3”]
4:.replace()
“javascript”.replace(/javascript/gi,”javaScript”) 前面是匹配,后面是替换的字符串
//所谓引用就是用引号加任意多个非引号字符,然后加括号构成的
var quote=/”([^”])*”/g;
//用大引号替换直接引号,并且用保留引号内容不变
text.replace(quote,”’$1‘”);
扩展,调换顺序
var s=/([a-zA-Z]+)\s+([a-zA-Z]+)/g;
document.write("i am".replace(s,"$2,$1"));
5: .exec() 注 pattern.exec(String) 是RegExp的方法
与match()不同的是全局检索时,返回的是一个储存相信的数组。(不是全局时一样)有个lastIndex属性标记最后一个匹配字符的位置(其他字符串方法会自动设为0),
//不是全局是与match() 只是调换了方法的顺序。
var pattern=/(ja)(va)/;
var test="java is java";
var array=pattern.exec(test);
document.write(array[0]+array[1]);
//全局时可以用lastIndex 属性
var pattern=/java/g;
var test="java is java";
var array=pattern.exec(test);//返回的是一个字符串
document.write(array+array.index+pattern.lastIndex);//可用index和lastIndex标记位置
//test()简单 返回的是ture和null 故可用一个Boolean型定义返回的结果
var s=pattern.test(test);
延伸java中的正则表达式
import="java.util.regex.*"
//最基本
Pattern p = Pattern.compile("a*b");
Matcher m = p.matcher("aaaaab");
boolean b = m.matches();
//Pattern.compile(regex,flag)
regex - 要编译的表达式。
flags - 匹配标志
可以组合多个flag
如 Pattern p = Pattern.compile("^java",Pattern.CASE_INSENSITIVE | Pattern.MULTILINE);
CASE_INSENSITIVE:忽略大小写 (?i)
忽略大小写
(?i)abc 表示abc都忽略大小写
a(?i)bc 表示bc忽略大小写
a((?i)b)c 表示只有b忽略大小写
也可以用Pattern.compile(rexp,Pattern.CASE_INSENSITIVE)表示整体都忽略大小写
MULTILINE: 启用多行模式 (?m)
Pattern p = Pattern.compile("java",
Pattern.CASE_INSENSITIVE | Pattern.MULTILINE);
Matcher m = p.matcher(
"java has regex Java has regex\n" +
"JAVA has pretty good regular expressions\n" +
"Regular expressions are in Java");
while(m.find())
out.println(m.group());
//结果为java Java JAVA java
其他见api
static int CANON_EQ启用规范等价。
static int CASE_INSENSITIVE启用不区分大小写的匹配。
static int COMMENTS模式中允许空白和注释。
static int DOTALL启用 dotall 模式。
static int LITERAL启用模式的字面值分析。
static int MULTILINE启用多行模式。
static int UNICODE_CASE启用 Unicode 感知的大小写折叠。
static int UNIX_LINES启用 Unix 行模式。
//pattern.split(String,limit)
//limit 控制数组的长度,如果为负数和零无限制,不过零会抛弃后面的空字符串,返回数组
Pattern p4=Pattern.compile("[,\\s]");//需要注意的是\\s
String s="i, guo";
String k[]=p4.split(s);
for(int i=0;i<k.length;i++)
{out.println(k[i]);}
//Matcher.find()
//limit 控制数组的长度,如果为负数和零无限制,不过零会抛弃后面的空字符串,返回数组
Pattern p4=Pattern.compile("[a-z]+",Pattern.CASE_INSENSITIVE);
String s="i,Kankan guo";
Matcher m = p4.matcher(s);
while(m.find()){out.println(m.group());}//这里可以添加到一个数组或向量
//Matcher.group()上面的例子
//group(0)=group() group(1)等同于js中的$1
//故java中调换顺序可以这么写
Pattern p4=Pattern.compile("(ja)(va)", Pattern.CASE_INSENSITIVE);
String s="java";
Matcher m = p4.matcher(s);
if(m.find())
{
s=m.group(2)+m.group(1);
out.print(s+m.start()+m.end());//start()和end()的用法
}
或者
Pattern p4=Pattern.compile("(ja)(va)", Pattern.CASE_INSENSITIVE);
String s="java JAVA";
Matcher m = p4.matcher(s);
s=m.replaceAll("$2$1");
out.print(s);//start()和end的用法
//Matcher.replaceAll(string) .replaceFirst(string);
即用string 替换匹配的字符串 all表示全部 first表示第一个
//用replaceAll去除html标签
Pattern p=Pattern.compile("<(/)*[(=?:._\")(\\s\\u4e00-\\u9fa5)(/{1,2}[\\w\\u4e00-\\u9fa5])]+(/)*>");
String s="<a href=\"/question/15344479.html?fr=idrm\" target=\"_blank\">汽车排量后跟的MT、AT是什么意思?</a> [<a href=\"/browse/155?fr=idrm\" class=\"lgy\">购车养车</a>]<br>";
Matcher m = p.matcher(s);
s=m.replaceAll("");
out.print(s);
//结果为:汽车排量后跟的MT、AT是什么意思? [购车养车]