快速了解正则表达式

2019-04-27 22:38|来源: 网路

除非您以前使用过正则表达式,否则您可能不熟悉一此术语。但是,毫无疑问,您已经使用过不涉及脚本的某些正则表达式概念。

例如,您很可能使用 ? 和 * 通配符来查找硬盘上的文件。? 通配符匹配文件名中的单个字符,而 * 通配符匹配零个或多个字符。像 data?.dat 这样的模式将查找下列文件:

data1.dat
data2.dat
datax.dat
dataN.dat


使用 * 字符代替 ? 字符扩大了找到的文件的数量。data*.dat 匹配下列所有文件:

data.dat
data1.dat
data2.dat
data12.dat
datax.dat
dataXYZ.dat


尽管这种搜索方法很有用,但它还是有限的。通过理解 * 通配符的工作原理,引入了正则表达式所依赖的概念,但正则表达式功能更强大,而且更加灵活。

正则表达式的使用,可以通过简单的办法来实现强大的功能。下面先给出一个简单的示例:

  • ^ 为匹配输入字符串的开始位置。

  • [0-9]+匹配多个数字, [0-9] 匹配单个数字,+ 匹配一个或者多个。

  • abc$匹配字母 abc 并以 abc 结尾,$ 为匹配输入字符串的结束位置。

实例

匹配以数字开头,并以 abc 结尾的字符串。:

var str = "123abc";
var patt1 = /^[0-9]+abc$/;
document.write(str.match(patt1));


以下标记的文本是获得的匹配的表达式:

123abc


继续阅读本教程将让您也可以自由应用这样的代码。


为什么使用正则表达式?

典型的搜索和替换操作要求您提供与预期的搜索结果匹配的确切文本。虽然这种技术对于对静态文本执行简单搜索和替换任务可能已经足够了,但它缺乏灵活性,若采用这种方法搜索动态文本,即使不是不可能,至少也会变得很困难。

通过使用正则表达式,可以:

  • 测试字符串内的模式。
    例如,可以测试输入字符串,以查看字符串内是否出现电话号码模式或信用卡号码模式。这称为数据验证。

  • 替换文本。
    可以使用正则表达式来识别文档中的特定文本,完全删除该文本或者用其他文本替换它。

  • 基于模式匹配从字符串中提取子字符串。
    可以查找文档内或输入域内特定的文本。

例如,您可能需要搜索整个网站,删除过时的材料,以及替换某些 HTML 格式标记。在这种情况下,可以使用正则表达式来确定在每个文件中是否出现该材料或该 HTML 格式标记。此过程将受影响的文件列表缩小到包含需要删除或更改的材料的那些文件。然后可以使用正则表达式来删除过时的材料。最后,可以使用正则表达式来搜索和替换标记。


发展历史

正则表达式的"祖先"可以一直上溯至对人类神经系统如何工作的早期研究。Warren McCulloch 和 Walter Pitts 这两位神经生理学家研究出一种数学方式来描述这些神经网络。

1956 年, 一位叫 Stephen Kleene 的数学家在 McCulloch 和 Pitts 早期工作的基础上,发表了一篇标题为"神经网事件的表示法"的论文,引入了正则表达式的概念。正则表达式就是用来描述他称为"正则集的代数"的表达式,因此采用"正则表达式"这个术语。

随后,发现可以将这一工作应用于使用 Ken Thompson 的计算搜索算法的一些早期研究,Ken Thompson 是 Unix 的主要发明人。正则表达式的第一个实用应用程序就是 Unix 中的 qed 编辑器。

如他们所说,剩下的就是众所周知的历史了。从那时起直至现在正则表达式都是基于文本的编辑器和搜索工具中的一个重要部分。


应用领域

目前,正则表达式已经在很多软件中得到广泛的应用,包括 *nix(Linux, Unix等)、HP 等操作系统,PHP、C#、Java 等开发环境,以及很多的应用软件中,都可以看到正则表达式的影子。

命令或环境 . [ ] ^ $ \( \) \{ \} ? + | ( )
vi




Visual C++




awk
awk是支持该语法的,只是要在命令 行加入 --posix or --re-interval参数即可,可见 man awk中的interval expression
sed



delphi
python
java √  √ 
javascript
php




perl
C#


相关问答

更多
  • 1. 比方说我需要判断一个串是不是一个邮箱,你需要判断它是是不是由字母数字下划线组成,还包含一个@,且只有一个@,而且这个@不能在最前最后,串的最后面需要以.com来结尾,而且这个.com还不能紧跟在@后面,balabala一大堆的规则,这么多要是用if来判断实在是太麻烦了吧。 2. 那么你写一个正则表达式可以一下子定义完所有的规则,我写一个简单的判断是否为邮箱的正则 ^[\da-zA-Z_]+@[\da-zA-Z_]+.com$, \d表示一个数字,a-zA-Z表示52个大小写的英文字母[\da-zA-Z ...
  • 关于正则表达式[2022-04-12]

    这个是经典的正则表达式30分钟入门教程。耐心看30分钟,你就能了解个大概,不一定会写,但一定要会用,有别人写好的拿过来用就是了,用的多了,自然就会写了 http://unibetter.com/deerchao/zhengzhe-biaodashi-jiaocheng-se.htm
  • 如果你曾经用过Perl或任何其他内建正则表达式支持的语言,你一定知道用正则表达式处理文本和匹配模式是多么简单。如果你不熟悉这个术语,那么“正则表达式”(Regular Expression)就是一个字符构成的串,它定义了一个用来搜索匹配字符串的模式。 许多语言,包括Perl、PHP、Python、JavaScript和JScript,都支持用正则表达式处理文本,一些文本编辑器用正则表达式实现高级“搜索-替换”功能。那么Java又怎样呢?本文写作时,一个包含了用正则表达式进行文本处理的Java规范需求(Spe ...
  • 常用正则表达式 特殊字符: . 匹配除换行符之外的任何字符 ^ 匹配字符串的开始 $匹配字符串的结束 *表示前面的匹配内容可以连续重复任意次 ?重复0次或一次 +重复一次或多次 {n}重复n次 {n,}重复n次或多次 {n,m}重复n次到m次 方括号 [abcde]匹配abcde中的任何一个 [1-9]匹配1到9中的任何一个 如果文本中包含特殊字符前面加"\",注意括号()也是特殊字符。 非特殊字符前面加""代表一定的含义比如: \b匹配单词的开头或者结尾 \d匹配数字 \w匹配字母 \s匹配空格 反义匹配 ...
  • http://deerchao.net/tutorials/regex/regex.htm 把这个花个把小时看完理解了, 你就是半个高手了,用熟悉了就是高手了
  • 正则表达式,就是用某种模式去匹配一类字符串的一个公式。 正则表达式由一些普通字符和一些元字符(metacharacters)组成。普通字符包括大小写的字母和数字,而元字符则具有特殊的含义 如: *表明+前的字符可以没有或者出现任意多次 +表明+前的字符至少出现一次 \s表明空格、换行、回车、tab等 ()表明一个组,group的意思 \"这里的\其实是转义符 |表明或者 \S 与\s是相反的意思,也就是除了\s以外的字符
  • 众所周知,在程序开发中,难免会遇到需要匹配、查找、替换、判断字符串的情况发生,而这些情况有时又比较复杂,如果用纯编码方式解决,往往会浪费程序员的时间及精力。因此,学习及使用正则表达式,便成了解决这一矛盾的主要手段。 大家都知道,正则表达式是一种可以用于模式匹配和替换的规范,一个正则表达式就是由普通的字符(例如字符a到z)以及特殊字符(元字符)组成的文字模式,它用以描述在查找文字主体时待匹配的一个或多个字符串。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。 自从jdk1.4推出java.ut ...
  • 正则表达式问题[2022-04-18]

    /// /// 判断输入的字符串只包含汉字 /// /// /// public static bool IsChineseCh(string input) { Regex regex = new Regex("^[\u4e00-\u9fa5]+$"); return regex.IsMatch(input); } /// /// 匹配3位或4位区号 ...
  • 正则表达式,就是用某种模式去匹配一类字符串的一个公式。一旦你弄懂它们,你就能把数小时辛苦而且易错的文本处理工作压缩在几分钟(甚至几秒钟)内完成。 在最简单的情况下,一个正则表达式看上去就是一个普通的查找串。例如,正则表达式"testing"中没有包含任何元字符,它可以匹配"testing"和"123testing"等字符串,但是不能匹配"Testing"。
  • java正则表达式[2022-01-30]

    ^ 和 $ 他们是分别用来匹配字符串的开始和结束,以下分别举例说明: "^The": 开头一定要有"The"字符串; "of despair$": 结尾一定要有"of despair" 的字符串; 那么, "^abc$": 就是要求以abc开头和以abc结尾的字符串,实际上是只有abc匹配。 "notice": 匹配包含notice的字符串。 你可以看见如果你没有用我们提到的两个字符(最后一个例子),就是说 模式(正则表达式) 可以出现在被检验字符串的任何地方,你没有把他锁定到两边。 接着,说说 '*', ...