Linux正则表达式-编写正则表达式
为了所有实用化的用途,你可以通过使用程序产生正确的结果。然而,并不意味着程序总是如你所愿的那样正确地工作。多数情况下,如果程序不能产生想要的输出,可以断定真正的问题(排除输入或语法错误)在于如何描述想要的东西。
换句话说,应该考虑纠正问题的地方是描述想要的结果的表达式。表达式不完整或者公式表示得不正确。例如,如果程序计算下面的表达式:
PAY = WEEKLY_SALARY * 52
并知道这些变量的值,它将计算出正确的结果。但是有人会反对,因为公式没有说明销售人员,他也得到了一份佣金。所以为了描述这种情况,这个表达式需要重新用公式表示为:
PAY = WEEKLY_SALARY * 52 + COMMISSION
也许你会认为,编写第一个表达式的人没有完全理解问题所涉及的范围,因此不能很好地进行描述。知道如何详细的进行描述是很重要的。如果请求某人为你拿一本书,而且如果摆在面前有很多书,那么就需要更加明确地描述你想要的书(或者满足与不确定的选择过程)。
这同样适用于正则表达式。程序(例如grep)简单而且容易使用。理解正则表达式的元素也不难。正则表达式允许编写简单的或复杂的模式描述。而使编写正则表达式很难(和有趣)的因素是应用的复杂性:模式出现在各种不同的情况和上下文中。复杂性是语言本身所固有的,就像你并不总能通过查询字典来获得某个语义的正确理解一样。
编写正则表达式的过程涉及3个步骤:
1.知道要匹配的内容以及它如何出现在文本中。
2.编写一个模式来描述要匹配的内容。
3.测试模式来查看它匹配的内容。
这个过程实质上与程序员开发程序的过程相似。步骤1可以当作规范,它反映理解要解决的问题以及如何解决它。步骤2类似于编写程序代码,而步骤3相当于运行程序并根据规范测试它。步骤2和步骤3需重复进行,知道程序令人满意为止。
对匹配描述进行测试可以确保这个描述和所期待的一样。它通常揭示一些令人惊奇的事。仔细检查测试的结果、比较输出和输入,这可以大大地提高对正则表达式的理解。可以按下面的方式解析模式匹配的结果:
Hits (击中)
--这是我想要匹配的行。
Misses (未击中)
--这是我不想匹配的行。
Omissions (遗漏)
--这是我不能匹配但想要匹配的行。
False alarms (假警报)
--这是我不想匹配的但却匹配了的行。
尝试完善模式的描述也可以从对立段解决;可以试着通过限制可能的匹配来排错假警报,通常扩展可能的匹配来试着捕获遗漏。
当你必须使用固定的字符串描述模式时,困难尤其明显。从固定字符串的模式中删除每个字符都会增加可能的匹配数量。例如,当搜索字符串"what" 时,还决定匹配"What",那么同时匹配"What"和"what"的惟一的固定字符串模式是"hat",即两者共用的最长的字符串。显然,搜索"hat"将产生不想要的匹配。给固定字符串模式添加每个字符都可能减少匹配数量。字符串"them" 通常比字符串"the"产生的匹配更少。
参考资料:http://www.linuxawk.com/communication/409.html
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。