POSIX风格正则表达式

From: http://blog.chinaunix.net/space.php?uid=20501242&do=blog&id=1940007

4.9  POSIX风格正则表达式

POSIX-Style Regular Expressions POSIX

你已经了解了正则表达式的基础知识,接下来我们可以讨论一下其细节。POSIX风格的正则表达式使用Unix地区系统(locale system),该系统提供了排序和识别字符的函数来让你智能地处理其他非英语的文本。特别地,各种语言组成单词的”字母”(如 à 和ç)不同,POSIX正则表达式考虑到了这一点并提供相应的字符类。

然而,POSIX正则表达式是为使用仅有原文的数据而设计的。如果数据中有空字节(\x00),那么正则表达式函数把它理解为字符串的末尾,并且匹配不会超过该字节位置。要匹配任意的二进制数据,需要使用本章稍后讨论的兼容Perl的正则表达式。正如我们已经提到的,Perl风格的正则表达式函数常常比等效的POSIX风格的函数快。

4.9.1  字符类

Character Classes

如表4-7所示,POSIX定义了许多可以在字符类中使用的命名字符集。在表4-7中给出的扩展是英语的。实际的字母根据使用者地区(locale)不同而不同。 译注1

表4-7:POSIX字符集

描  述

扩  展

[:alnum:]

字母和数字字符

[0-9a-zA-Z]

[:alpha:]

 (letters)字母字符(字母)

[a-zA-Z]

[:ascii:]

7位ASCII

[\x01-\x7F]

[:blank:]

水平空白符(空格、制表符)

[ \t]

[:cntrl:]

控制字符

[\x01-\x1F]

[:digit:]

数字

[0-9]

[:graph:]

用墨水打印的字符(非空格、非控制字符)

[^\x01-\x20]

[:lower:]

小写字母

[a-z]

[:print:]

可打印字符(图形类加空格和制表符)

[\t\x20-\xFF]

[:punct:]

任意标点符号,如句点(.)和分号(;)

[-!"#$%&'( )*+,./:;<=>?@[\\\]^_'{|}~]

[:space:]

空白(换行、回车、制表符、空格、垂直制表符)

[\n\r\t \x0B]

[:upper:]

大写字母

[A-Z]

[:xdigit:]

十六进制数字

[0-9a-fA-F]

 每一个[:something:]类都可被用于替代一个字符类中的字符。例如,要查找任一数字字符、大写字母或一个@ 符号,可以使用下面的正则表达式:

[@[:digit:][:upper:]]

但是,不能把一个字符类当作一个范围的终点使用:

ereg('[A-[:lower:]]', 'string');        //非法的正则表达式

一些地区把某些字符序列当作一个单独的字符来考虑——它们被称为排序序列(collating sequence)。在字符类中匹配这些多字符序列中的一个时,要把它用[. 和 .]括起来。

例如,如果你的地区有排序序列ch,你可以使用下面的字符类来匹配s、t或ch:

[st[.ch.]]

POSIX最后的字符类扩展是等价类(equivalence class),把字符用[= 和 =]括起来指定。等价字符类匹配有相同整理顺序的字符(由当前locale定义)。例如,一个地区可能定义a、á和 ä有相同的排序优先级。要匹配它们中的一个,等价类为[=a=]

4.9.2  

Anchors

锚(anchor) 将匹配限制在字符串中特定位置(锚不匹配目标字符串中的实际字符)。表4-8列出了POSIX正则表达式支持的锚。

表4-8:POSIX锚

匹  配

^

字符串开始

$

字符串末尾

[[:<:]]

单词开始

[[:>:]]

单词末尾

单词边界指在一个空白符和一个标识符(字母数组或下划线)之间的那一点:

ereg('[[:<:]]gun[[:>:]]', 'the Burgundy exploded');      //返回false

ereg('gun', 'the Burgundy exploded');                       //返回true

注意字符串的开头和结尾也可以作为单词边界。

4.9.3  函数

Functions

POSIX风格的正则表达式有三类函数:匹配、替换和拆分。

4.9.3.1  匹配

ereg( )函数接收一个模式、一个字符串和一个可选的数组。如果给定数组的话就组装数组,并根据是否在字符串中找到模式的一个匹配而返回truefalse

$found = ereg(pattern, string [, captured ]);

例如:

ereg('y.*e$', 'Sylvie');      //返回true

ereg('y(.*)e$', 'Sylvie', $a); // 回true,$a是array('Sylvie', 'lvi')

数组的第零个元素设置为与之匹配的整个字符串。第一个元素是与第一个子模式匹配的子字符串,第二个元素是与第二个子模式匹配的子字符串,依此类推。

eregi( )函数是不区分大小写的ereg( )。它的参数和返回值都和ereg( )相同。

示例4-1使用模式匹配来确定一个信用卡号是否通过了Luhn校验,以及该数字是否符合特定的信用卡格式。

示例4-1:信用卡验证

// Luhn校验可以判断一个信用卡号是否遵循正确的校验;但是它不能告知该卡号是否已经//发行、当前是否为活动的或有足够的空间来存入金额。

function IsValidCreditCard($inCardNumber, $inCardType) {

  //假设是正确的

  $isValid = true;

    

  //从字符串中删除所有非数字字符

  $inCardNumber = ereg_replace('[^[:digit:]]','', $inCardNumber);

    

  //确认卡号和类型匹配

  switch($inCardType) {

    case 'mastercard':

      $isValid = ereg('^5[1-5].{14}$', $inCardNumber);

      break;

    

    case 'visa':

      $isValid = ereg('^4.{15}$|^4.{12}$', $inCardNumber);

      break;

    

    case 'amex':

      $isValid = ereg('^3[47].{13}$', $inCardNumber);

      break;

    

    case 'discover':

      $isValid = ereg('^6011.{12}$', $inCardNumber);

      break;

    

    case 'diners':

      $isValid = ereg('^30[0-5].{11}$|^3[68].{12}$', $inCardNumber);

      break;

    

      case 'jcb':

      $isValid = ereg('^3.{15}$|^2131|1800.{11}$', $inCardNumber);

      break;

  }

    

  //通过了基本的测试,现在进行Luhn校验

  if($isValid) {

    //翻转

    $inCardNumber = strrev($inCardNumber);

    

    //合计数字的总位数,在奇数位加倍

    $theTotal = 0;

    for ($i = 0; $i < strlen($inCardNumber); $i++) {

      $theAdder = (int) $inCardNumber[$i];

    

      //使在奇数位的数字加倍

      if($i % 2) {

        $theAdder = $theAdder << 1;

        if($theAdder > 9) { $theAdder -= 9; }

      }

    

      $theTotal += $theAdder;

    }

    

    //合法的卡号除以10

    $isValid = (($theTotal % 10) == 0);

  }

    

  return $isValid;

}

4.9.3.2  替换

ereg_replace( )函数的参数为一个模式、一个替换字符串和一个要在其中进行查找的字符串。函数返回查找字符串的一个拷贝,字符串中与模式匹配的文本用替换字符串来代替。

$changed = ereg_replace(pattern, replacement, string);

如果该模式有任何分组的子模式,则该匹配可以通过把字符\1到\9放到替换字符串中来访问。例如,可以使用ereg_replace()以等价的HTML标签替换用[b]和[/b]标签包含的字符:

$string = 'It is [b]not[/b] a matter of diplomacy.';

echo ereg_replace ('\[b]([^[]*)\[/b]', '<b>\1</b>', $string);

It is <b>not</b> a matter of diplomacy.

eregi_replace( )函数是ereg_replace( )不区分大小写的形式。它的参数和返回值和ereg_replace( )的相同。

4.9.3.3  拆分

split( )函数使用正则表达式来把字符串拆分为较小的块,作为一个数组返回。如果出现错误,则split()返回false。可以选择要返回多少个小块:

$chunks = split(pattern, string [, limit ]);

本函数的模式用于匹配分隔成块的文本。例如,从一个算术表达式中拆分项:

$expression = '3*5+i/6-12';

$terms = split('[/+*-]', $expression);

// $terms 是 array('3', '5', 'i', '6', '12')

如果指定了一个匹配数目限制,则数组的最后一个元素会存放剩余的字符串:

$expression = '3*5+i/6-12';

$terms = split('[/+*-]', $expression, 3);

// $terms 是 array('3', '5', 'i/6-12')


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/406609.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring对事务管理的支持的发展历程(基础篇)

1、问题Java代码 Connection conn DataSourceUtils.getConnection(); //开启事务 conn.setAutoCommit(false); try { Object retVal callback.doInConnection(conn); conn.commit(); //提交事务 return retVal; }catch (Excep…

最新xampp下安装mod_security,mod_evasive,mod-cband笔记

来源&#xff1a;纯月部落mod_security官方的文档有一些问题&#xff0c;亲手装了一遍&#xff0c;现将问题记录如下Windows xampp版本 假设xampp安装在D:\xampp1 下载mod_security-2.5.9-win32.zip&#xff0c;解压缩2 将libxml2.dll拷贝到D:\xampp\apache\bin下面3 将mod_sec…

Bash字符串处理(与Java对照) - 17.判断是否以另外的字符串结尾

From: http://codingstandards.iteye.com/blog/1187353 In Java String.endsWith oolean endsWith(String suffix) 测试此字符串是否以指定的后缀结束。 StringUtils.endsWith & StringUtils.endsWithIgnoreCase & StringUtils.endsWithAny org.apache.c…

[转载]用c写PHP的扩展接口(php5,c++)

原文&#xff3b;http://bugs.tutorbuddy.com/php5cpp/php5cpp/&#xff3d;第1节. 开始之前开始前&#xff0c;我要说明&#xff1a;这篇文章所描述的主要是在UNIX的PHP环境上的。另外一点我要说明的是&#xff1a;文中所介绍的方法在PHP 4.3.x和PHP 5下都是可行的。尽管我们在…

web前端——transform变形 旋转角度正负的判断

在使用CSS的transform的变形效果的时候&#xff0c;总是被这个角度的正负搞的头大&#xff0c;特意写出来&#xff0c;和大家分享 首先&#xff0c;我们要学会怎么看 假设需要围绕x轴做旋转&#xff0c;那么我们将x轴的正向指向我们自己&#xff0c;然后再看顺时针和逆时针&am…

话里话外:成功的ERP需要全程的流程变革(三)

成功的ERP需要全程的流程变革流程变革最佳实践5步走流程变革的最佳实践&#xff0c;是将一个颇具风险的流程重组过程分解为几个分步实现的步骤&#xff0c;并与ERP的实施同步开展&#xff0c;再经过几轮优化改进的循环&#xff0c;达到变革的目标——提高流程的效益和效率。伴随…

Bash字符串处理(与Java对照) - 18.格式化字符串

From: http://codingstandards.iteye.com/blog/1198098 In Java class Formatter 参见&#xff1a;http://download.oracle.com/javase/6/docs/api/java/util/Formatter.html#syntax String.format static String format(String format, Object... args) 使用指定…

Unity基础知识学习笔记二

1&#xff0c;object Instantiate(object original,Vector3 position,Quaternion rotation) 克隆原始物体&#xff0c;并返回克隆物体。例如&#xff1a;Instantiate(prefab,new Vector3(1,1,1),Qutaternion.identity);克隆一个prefab物体。2,InputManager,输入管理器&#xff…

JavaScript 监听手机端的touch滑动事件(滑动手势)

如何监听移动端滑动手势&#xff08;上 / 下 / 左 / 右滑动&#xff09;&#xff0c;今天记录下。 var startx, starty;//获得角度 function getAngle(angx, angy) {return Math.atan2(angy, angx) * 180 / Math.PI; };//根据起点终点返回方向 1向上滑动 2向下滑动 3向左滑动 …

雅虎衰落源于公司领袖缺乏远见与决断个性

文/ 周鸿祎雅虎的衰落&#xff0c;公司领袖负有不可推卸的责任&#xff0c;杨致远缺乏做出决断的个性和能力。 与充满商业智慧的微软和Google相比&#xff0c;雅虎显得太过幼稚。我之前创立的3721卖给了雅虎&#xff0c;后来还有过一段合作&#xff0c;所以对它有较深入的了解。…

java的Random类详解

Random类是一个专门用来生成一个伪随机数的类&#xff0c;这个类提供了两个构造函数&#xff0c;一个使用默认的种子&#xff0c;另一个需要程序员显示传入一个long型整数的种子。与Math类中的random方法生成的伪随机数不同的是&#xff0c;Math的random方法生成的伪随机数取值…

Bash字符串处理(与Java对照) - 19.查找字符的位置

From: http://codingstandards.iteye.com/blog/1198917 In Java String.indexOf & String.lastIndexOf int indexOf(int ch) 返回指定字符在此字符串中第一次出现处的索引。 int indexOf(int ch, int fromIndex) 从指定的索引开始搜索&#x…

mint-ui 写一个下拉滑动选择,mt-popup和mt-picker结合使用

<template><div id"feedback"><div click"getpopupVisible">产品选择</div><mt-popupv-model"popupVisible"popup-transition"popup-fade"position"bottom"><div class"picker-toolb…

够学习一辈子的生活经典

说话要用脑子&#xff0c;敏事慎言&#xff0c;话多无益&#xff0c;嘴只是一件扬声器而已&#xff0c;平时一定要注意监督、控制好调频旋钮和音控开关&#xff0c;否则会给自己带来许多麻烦。讲话不要只顾一时痛快、信口开河&#xff0c;以为人家给你笑脸就是欣赏&#xff0c;…

设计模式之单一职责原则

超前的设计或者过度的设计都不是良好的设计&#xff0c;很多时候我们等到代码在第一次变化的时候可以及时作出反应。 What 就一个类&#xff08;接口、结构体、方法等等&#xff09;而言&#xff0c;应该仅有一个引起它变化的原因。 Why 软件设计真正要做的许多内容&#xff0c…

makefile常用语法讲解(1)

From: http://www.cnblogs.com/mydomain/archive/2011/08/12/2136083.html 1、make是一个解释makefile中指令的命令工具。Make工具最主要也是最基本的功能就是通过makefile文件来描述源程序之间的相互关系并自动维护编译工作。而makefile 文件需要按照某种语法进行编写&#…