为什么使用正则表达式?
典型的搜索和替换操作要求您提供与预期的搜索结果匹配的确切文本。虽然这种技术对于对静态文本执行简单搜索和替换任务可能已经足够了,但它缺乏灵活性,若采用这种方法搜索动态文本,即使不是不可能,至少也会变得很困难。
通过使用正则表达式,可以:
- 测试字符串内的模式。
- 例如,可以测试输入字符串,以查看字符串内是否出现电话号码模式或信用卡号码模式。这称为数据验证。
- 替换文本。
- 可以使用正则表达式来识别文档中的特定文本,完全删除该文本或者用其他文本替换它。
- 基于模式匹配从字符串中提取子字符串。
- 可以查找文档内或输入域内特定的文本。
例如,您可能需要搜索整个网站,删除过时的材料,以及替换某些 HTML 格式标记。在这种情况下,可以使用正则表达式来确定在每个文件中是否出现该材料或该 HTML 格式标记。此过程将受影响的文件列表缩小到包含需要删除或更改的材料的那些文件。然后可以使用正则表达式来删除过时的材料。最后,可以使用正则表达式来搜索和替换标记。
几个重要的元字符
贪婪型元字符:*,+,{n,}
懒惰型元字符:*?,+?,{n,}?
注意
javascript中用正则表达式的字面量的时候,“/”必须转义,但是用RegExp的时候不需要,如:
var p=/<[hH]([1-6])>.*?<\/[hH]\1>/g;//能正确匹配<h1>asda</h1>
var p=new RegExp("<[hH]([1-6])>.*?</[hH]>","g");//正确匹配
var p=/<[hH]([1-6])>.*?</[hH]>/g;//无法匹配
\1属于回溯引用,引用的是前面的第1个子表达式中匹配的内容,这里([1-6])匹配到的是1。
\2引用的是前面的第2个子表达式中匹配的内容。</pre>...<p></p>
前后查找实际就是一个子表达式,如查找http://www.baidu.com/的协议名,用.+(?=:),结果为http,不包含“:”
向前查找是以?=开始的子表达式。
向后查找是以?<=开始的子表达式。
(?=)正向前查找,查找与模式匹配的文本。
(?!)负向前查找,查找不与模式匹配的文本。
(?<=)正向后查找。
(?<!)负向后查找。
正则表达式里的回溯引用条件
?表明这是一个条件,backreference表示一个回溯引用,true-regexp是一个只在backreference存在时才会被执行的子表达式。