Chapter 21_3 模式

  很多地方都会看到各种匹配模式,每次接触这些函数,免不了望文生畏。

  今天就来好好面对它、认识它、了解它、最后战胜它。

  匹配模式都是用一串常规的字符串来描述,最主要的是理解这些字符串的语法及含义(即它能匹配到什么)。

^$()%.[]*+-?
魔法字符,具有特殊的含义。

%作为这些魔法字符的转义字符,还可以用于其他所有非字母和数字。

%.    表示匹配一个"."

%% 表示匹配一个“%”

当不确定一个字符是否需要转义时,应该前置一个转义符。

. 所有字符
%a 字母
%c 控制字符
%d 数字
%g 除空白符外的可打印字符
%l 小写字母
%p 标点符号
%s 空格字符
%u 大写字母
%w 字母及数字
%x 16进制数字符号
%x
表示字符x(这里的x是任意非字母或数字的字符),这是对魔法字符转义的标准方法。

多有非字母或数字的字符(标点,非魔法字符)都可以用前置一个‘%’放在模式串中表示自身。

[set]
表示set中所有字符的联合。可以以‘-’连接升序书写范围两端的字符,来表示一个范围的字符集。

上一个%x形式也可以在set中使用表示其中的一个元素。其它出现在set中的字符则代表它们自己。

例如:

[%w_](或[_%w]) 表示所有的字母数字加下划线

[0-7] 表示8进制数字

[0-7%l%-] 表示8进制数字、 小写字母、‘-’ 字符。

交叉使用类和范围的行为未定义。因此,像[%a-z] 或 [a-%%] 这样的模式串没有意义。

[^set] 表示set的补集

所有单个字母表示的类别(%a,%c,等),若将其字母改为大写,均表示对应的补集。

例如:%S表示所有非空格的字符。

%A表示所有非字母字符:

print(string.gsub("hello, up-down!", "%A" , "."))
--> hello..up.down.    4     -- 4 是gsub返回的第二个结果

  对于Lua来说,模式就是普通的字符串,只有模式函数才会解释它们,此时才会将‘%‘当作转义符来处理。

在模式中放入一个引号的方法,与在普通字符串中放入引号的方法相同,需要用"\"来对引号进行转义。

  在一对方括号"[ ]"内将不同的字符分类或单个字符组合起来,即可创建出自己的字母,数字和下划线:

"[01]" :表示匹配二进制数字

"[%[%]]":表示匹配方括号本身

  若要统计一段文本中元音的数量,可这么写:

nvow = select(2,string.gsub(text , "[AEIOUaeiou]",""))

  有的时候,需要写出一段字符范围:

"[0-9]"  即为 "%d"

"[0-9a-fA-F]"  即为 "%x"

"[0-7]" 即为查找一个八进制数字,就要比"[01234567]"好

  在一个字符集前加"^",可以得到这个字符集的补集,像"[^0-7]"就表示所有非八进制数字的字符。

"[^\n]"表示除了换行符以外的其他字符。但是对于简单的分类,可以使用大写形式得到其补集,"%S"显然比"[^%s]"简单。

但是,像"[a-z]" 可能并不等于"%l"。在某些区域设置中,后者可能会包括像"á"、"ú" 、"ü"等。

  可以通过修饰符来描述模式中的重复部分和可选部分。Lua的模式提供4中修饰符:

* 0或多个,匹配尽可能长的串
+ 1或多个,匹配尽可能长的串
- 0或多个,和*不同,它匹配尽可能短的串
? 可选部分,0或1次,比如:A?将匹配0或一个A,只要有可能,它会匹配一个。
% 这里的n可以从1-9;匹配一个等于n号捕获物的子串,这儿没有看懂
%bxy
这里的x和y是两个明确的字符;匹配以x开始y结束,且其中x和y保持平衡的字符串。

意思是,如果从左到右读这个字符串,对每次读到一个x就+1,读到一个y就-1,最终

结束处的那个y是第一个记数到0的y。比如:条目"%b()"可以匹配到括号平衡的表达式。

%f[set] 指边境模式;这个条目会匹配到一个位于set内某个字符之前的一个空串,

%a+举例说明:

print(string.gsub("one,and two ;and three","%a+","word"))
--> word , word word; word word

%d+举例说明:

print(string.match("the number 1298 is even","%d+"))
--> 1298

*与+的用途,一个典型是匹配一个模式不同部分之间的空格。例如,匹配像"()"或"(  )"这样的一对空圆括号。

时间: 2024-07-31 14:29:25

Chapter 21_3 模式的相关文章

微信支付—— 扫码支付

个人认为扫码支付比Jsapi支付从开发和使用上要顺心的多.扫码支付不用担心是PC端还是移动浏览器还是微信客户端访问的问题,生成一个二维码,扫描支付即可. 一些配置和代码SDK以及SDK存在的错误可以参考上一篇 微信支付的文章 http://blog.csdn.net/m0sh1/article/details/45199711 友情提示以下内容实在简陋 - -# 如果你跑通了 Jsapi支付,那么扫码支付其实没什么太特别的. 扫码支付发起支付的文件在 example SDK 中的 native.

Chapter 8 工厂方法模式

工厂方法模式实现时,客户端需要决定实例化哪一个工厂来实现运算类,选择判断的问题还是存在的,也就是说,工厂方法把简单工厂的内部逻辑判断移到了客户端代码来进行.你想要加功能,本来是改工厂类的,而现在是修改客户端. 代码如下: package xiao; class LeiFeng{ public void sweep(){ System.out.println("sweep!"); } public void wash(){ System.out.println("wash!&q

Chapter 7 代理模式

代理模式:为其它对象提供一种代理以控制对这个对象的访问. 代码: package xiao; class Girl{ private String name; public void setName(String name){ this.name = name; }}interface GiveGift{ public void giveDolls(); public void giveFlowers(); public void giveChocolate();}class Pursuit i

Chapter 10 模版方法模式

我们要完成在某一细节层次一致的一个过程或一系列步骤,但其个别步骤在更详细的层次上的实现可能不同时,我们通常考虑用模版模式来处理. 模版方法模式:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中.模版方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤. 模版方法通过把不变行为搬移到超类,去除子类中的重复代码来体现它的优势,相当于提供了一个很好的代码复用平台. 当不变和可变的行为在方法的子类实现中混合在一起的时候,不变的行为就会在子类中重复出现.我们通过模版方法模式把这些行为搬移

Chapter 9 原型模式

原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 简单的说就是clone一个对象实例.使得clone出来的copy和原有的对象一模一样. 插一个简单使用clone的例子,如果一个对象内部有可变对象实例的话,public API不应该直接返回该对象的引用,以防调用方的code改变该对象的内部状态.这个时候可以返回该对象的clone. 一般而言,我们要的clone应该是这样的.copy和原型的内容一样,但是又是彼此隔离的.即在clone之后,改变其中一个不影响另外一个. 原

Chapter 2.策略模式

首先贴一段代码: package xiao;import java.util.Scanner;class CashSuper{    private int num;    private double price;    public int getNum() {        return num;    }    public void setNum(int num) {        this.num = num;    }    public double getPrice() {  

Chapter 10. 设计模式--工厂模式

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication9 { /*设计模式:工厂模式 */ //父类:NoteBook public abstract class NoteBook { public abstract void SayHello(); } //子类: public class ASUS : NoteBook

<Chapter 2>2-2-1.用户偏好模式(The User Preferences Pattern)

在这个模块中我们要创建的应用是一个简单的钟.当一个用户访问这个网站时,这个应用会更具服务器的系统时间显示当前的时间.默认情况下,这个应用使用标准国际时间(UTC)时区显示当前时间.用户可以使用Google帐户登录和偏好设定来自定义时区. 这个应用演示了三个App Engine的特性: ?datastore,主要存储数据,一致的,可靠的,可扩展的. ?内存缓存,辅助存储,比datastore要快,但从长远看不一定时持久的. ?Google帐户,使用Google用户帐户系统来验证和识别用户的能力.

Chapter 1.简单工厂模式

该篇文章通过一个写计算器控制台程序,来导入文章主题. 首先,要注意代码规范,变量命名有意义,不能随意用A,B,C;    功能要封装好,不要写在一个主函数里,另外要考虑后期需求的更改,如果出现多个函数里面的代码大部分相同,那么我们要学会提取公共行为.属性来构造一个父类,具体的子类来继承父类.继承最好是is而不是has,例如人是哺乳动物,可以把哺乳动物抽象出来成为一个父类.而人有手,这时候手就不能抽象出来. 工厂:一个单独的类来做这个创造实例的过程. 编程是一门技术,更加是一门艺术.