函数原型 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. 一篇文章搞定git

    git学习 一.背景(当成故事去读) Linus 虽然创建了 Linux,但 Linux 的壮大是靠全世界热心的志愿者参与的,这么多人在世界各地为 Linux 编写代码,那 Linux 的代码是如何管 ...

  2. c语言命名规范图

    来自armbbs

  3. 使用zeebe DebugHttpExporter 查看zeebe 工作流信息

    zeebe 提供了一个DebugHttpExporter 可以方便的查看部署以及wokrflow 运行信息 以下是一个简单的运行试用,同时集成了prometheus,添加了一个简单的grafana d ...

  4. vue项目的安装与启动

      第一步:安装Node 检测Node是否安装成功 node -v 第二步:安装vue-cli     命令:npm install vue-cli -g 第三步:搭建项目命令 vue init we ...

  5. python cookbook3

    1.算GC含量 def validate_base_sequence(base_sequence, RNAflag = False): #判断序列是否只含有A.T.G.C.U seq = base_s ...

  6. MySQL日记

    MySQL日记 MySQL——day01:https://www.cnblogs.com/noonjuan/diary/2019/07/24/11241543.html MySQL——day02:ht ...

  7. MySQL实战45讲学习笔记:第一讲

    一.MySQL逻架构图 二.连接器工作原理刨析 1.连接器工作原理图 2.原理图说明 1.连接命令 mysql -h$ip -P$port -u$user -p 2.查询链接状态 3.长连接端连接 1 ...

  8. [LeetCode] 234. Palindrome Linked List 回文链表

    Given a singly linked list, determine if it is a palindrome. Example 1: Input: 1->2 Output: false ...

  9. [LeetCode] 213. House Robber II 打家劫舍之二

    You are a professional robber planning to rob houses along a street. Each house has a certain amount ...

  10. JavaWeb 笔记

    WEB-INF 目录 web.xml 文件配置 精准匹配 "/" "/index" "/go/index.html" 路径通配匹配 &quo ...