函数原型 string.find(s, pattern [, init [, plain]] )

s: 源字符串

pattern: 待搜索模式串

init: 可选, 起始位置

plain: 我没用过

① 子串匹配:

print(string.find("haha", 'ah') ) ----- 输出 2 3

注意: lua 里面数组或者字符串的字符, 其下标索引是从 1 开始, 不是 0

string.find 默认情况下返回两个值, 即查找到的子串的 起止下标, 如果不存在匹配返回 nil。

如果我们只想要 string.find 返回的第二个值, 可以使用 虚变量(即 下划线)

_, q=string.find("haha", 'ah')
print(q) ----- 输出 3

② 模式匹配:

pair = " name = Anna "
print(string.find(pair, "(%a+)%s*=%s*(%a+)") ---- 输出 2 12 name Anna

解释:

如果 find 的第二个参数使用了某种匹配模式, 并且模式串里面带括号。 那么表示会“捕捉”括号括起来的模式匹配到的字符串。 捕捉, 当然会把他们作为返回值。这里捕捉了两下, 所以 find 多返回了两个值

那么, 这个模式是怎么匹配的呢?

Lua 支持的字符类有:

. 任意字符

%s 空白符

%p 标点

%c 控制字符

%d 数字

%x 十六进制数

%z 代表0的字符

%a 字母

%l 小写字母

%u 大写字母

%w 字母数字

字符类的大写形式代表相应集合的补集, 比如 %A 表示除了字母以外的字符集

另外,* + - 三个,作为通配符分别表示:

*: 匹配前面指定的 0 或多个同类字符, 尽可能匹配更长的符合条件的字串

+: 匹配前面指定的 1 或多个同类字符, 尽可能匹配更长的符合条件的字串

-: 匹配前面指定的 0 或多个同类字符, 尽可能匹配更短的符合条件的字串

于是, "(%a+)%s=%s(%a+)" 表示, 先匹配一个或多个字母, 然后是零个或多个空白符(比如空格), 然后是个 '=', 然后空白符, 然后字母。这样, 满足匹配的只有 "name = Anna"。 所以输出位置为 2 12.

因为捕获了两个 (%a+), 也就是 name, Anna 这两个单词, 所以还输出了这两个单词

另外, lua 使用 %1-%9 表示拷贝捕获。举例说:

s="abc \"it's a cat\""
_,_,_,q=string.find(s, "([\"'])(.-)%1")
print(q) -----输出: it's a cat

首先, ["'] 表示匹配 双引号或者单引号, 因为有括号,所以引号被捕获。 然后匹配几个任意字符并且捕获他, 最后 %1 匹配与第一次捕获到的(即引号)相同的字串。所以整个模式匹配到的是 "it's a cat", 而第二次捕获的是去掉两头引号的字串, 即 it's a cat.

还有, '-' 与 '' 到底有什么不同呢? 在上面, "(["'])(.)%1" 匹配到的结果与 '-' 是一样的。尽可能匹配更长, 尽可能匹配更短 究竟什么不同呢?看例子:

print( ("\"hello\" \"hello\""):find('"(.+)"') ) ----输出 1 15 hello" "hello
print( ("\"hello\" \"hello\""):find('"(.-)"') ) ----输出 1 7 hello
  • 尽可能长, 所以匹配了首尾两个 引号, 捕获了中间的 (hello" "hello)
  • 尽可能短, 所以碰到第二个引号就说匹配完了, 因此只捕获了第一个 (hello)

原文链接:http://blog.csdn.net/zhangxaochen/article/details/8084396

Lua 字符串查找函数 string.find(s, pattern [, init [, plain]] )【转】的更多相关文章

  1. php中常用的字符串查找函数strstr()、strpos()实例解释

    string strstr ( string $haystack , mixed $needle [, bool $before_needle = false ] ) 1.$haystack被查找的字 ...

  2. C/C++字符串查找函数

    C/C++ string库(string.h)提供了几个字符串查找函数,如下: memchr 在指定内存里定位给定字符 strchr 在指定字符串里定位给定字符 strcspn 返回在字符串str1里 ...

  3. C/C++字符串查找函数 <转>

    C/C++ string库(string.h)提供了几个字符串查找函数,如下: memchr 在指定内存里定位给定字符 strchr 在指定字符串里定位给定字符 strcspn 返回在字符串str1里 ...

  4. php字符串查找函数 php查找字符串中出现的次数函数substr_count,判断字符串中是否包含另一个字符串函数strpos

    php字符串查找函数 php查找字符串中出现的次数函数substr_count,判断字符串中是否包含另一个字符串函数strpossubstr_count($haystack, $needle [,$o ...

  5. ubuntu/wireshark --Lua: Error during loading: [string "/usr/share/wireshark/init.lua"]:45问题解决

    错误如下: 解决方案:修改init.lua 直接运行wireshark的话会报错: Lua: Error during loading:[string "/usr/share/wiresha ...

  6. JS字符串格式化函数 string.format

    原生JS写的仿C#的字符串format函数,在此基础上又增加了便于JS使用的字面量对象参数. 参照C#中的规则,调用的时候会检测字符串格式,如果字符串格式不规范,或者传入的参数为null或undefi ...

  7. lua字符串对齐函数

    最近要用到字符串对齐,开始只是一部分字符串,就直接加空格了,后来发现有很多, 于是写了个字符串对齐的函数. --功能:分割字符串 --参数:带分割字符串,分隔符 --返回:字符串表 function ...

  8. lua字符串分割函数[适配中文特殊符号混合]

    lua的官方函数里无字符串分割,起初写了个简单的,随之发现如果是中文.字符串.特殊符号就会出现分割错误的情况,所以就有了这个zsplit. function zsplit(strn, chars) f ...

  9. 字符串查找函数(BF)

    //模拟字符串定位函数 // s: abcbbghi // t: ghi // 返回6 #include <iostream> #include <string> #inclu ...

随机推荐

  1. Revit 2019 下载链接

    [安装环境]:win7/win8/win10 [64位下载] 百度网盘链接:pan.baidu.com/s/1Vq5Cnyj1G-oMNup_sXvxfQ  提取码:d6xd

  2. shiro 基本知识测试

    shiro 基本知识测试 <!--shiro核心包--> <dependency> <groupId>org.apache.shiro</groupId> ...

  3. 【Spring Data JPA篇】JPA的底层原理(二)

    一.接口继承结构 二.底层原理

  4. django之视图层和部分模板层

    视图层 小白必会三板斧(三个返回的都是HttpResponse对象,通过看源码,可以知道是内部实现) 1.HttpResponse # 返回字符串 2.render # 返回一个html页面 还可以给 ...

  5. DLinNLP

    2015蒙特利尔深度学习暑期学校之自然语言处理篇 用户1737318 8月3日至8月12日在蒙特利尔举办的深度学习署期学校中,来自不同领域的深度学习顶尖学者 (Yoshua Bengio, Leon ...

  6. DES介绍

    DES对称加密算法中的一种.是一个分组加密算法. 密钥长64位.(密钥事实上是56位参与DES运算(第8.16.24.32.40.48.56.64位是校验位)56 位    8位奇偶校验位. DES算 ...

  7. C# 集合根据属性去重筛选

    1.单个属性去重筛选 //去重筛选 var ChgDtlVoList = datas.Where((x, i) => datas.FindIndex(z => z.ChgId == x.C ...

  8. SQL中group by的注意事项

    最最最最重要的: group by有一个原则,就是select后面所有的列中,没有使用聚合函数的列,必须出现在group by子句中. group by子句中的注意事项: 1,不能使用别名(因为执行顺 ...

  9. <binary search> 154 162

    154. Find Minimum in Rotated Sorted Array II 当数组中存在大量的重复数字时,就会破坏二分查找法的机制,将无法取得 O(lgn) 的时间复杂度,又将会回到简单 ...

  10. 11/3 <binary search>

    278. First Bad Version 二分法,如果isBadVersion返回true则坏版本在左边,right = mid,否则 left = mid + 1. 注意溢出问题 left+(r ...