搜索
aardio官方社区 门户 查看主题

请问 数字+、的内容如何匹配

发布者: SysRq | 发布时间: 2015-11-25 21:56| 查看数: 2027| 评论数: 11|帖子模式

str=
"1、模式表达式基本的语法与正则表达式很接近,是正则表达式的简化版本;
A、这样的设计目的是为了增加不同编程语言之间的互通性、有利于学习掌握以及促进使用的熟练程度
B、模式表达式基本的语法与正则表达式很接近
C、是正则表达式的简化版本
D、模式表达式基本的语法与正则表达式很接近
2、实际上正则表达式对嵌套的配对支持非常糟糕。                  
A、实际上   B、表达式对    C、的配对     D、常糟糕
3、模式表达式基本的语法与正则表达。
A、证明                B、证明
C、时间                D、证明       
4、模式表达式基本的语法与正则表达式很接近       
A、一天              B、七天
C、通知       
"
io.open()
for m,m2,m3 in string.gmatch( str,"(\d.?、.*?)\d.?、") {
io.print(m)
}
execute("pause")
为什么只能匹配到 1 和 3的内容 2和4的内容匹配不出来呢 谢谢谁能帮我匹配下

最新评论

roger 发表于 2015-11-25 23:17:24

之所以简化正则表达式,是希望你不要把模式匹配写的过于复杂,以至于把简单的事复杂化。 如果你遇到不知道模式匹配怎么写了,或者写不好了, 说明是时候该把你的

之所以简化正则表达式,是希望你不要把模式匹配写的过于复杂,以至于把简单的事复杂化。

如果你遇到不知道模式匹配怎么写了,或者写不好了,
说明是时候该把你的模式表达式改的更简单了,而不是去寻找一个更强大更复杂的模式表达式。
var str = "1、模式表达式基本的语法与正则表达式很接近,是正则表达式的简化版本;
A、这样的设计目的是为了增加不同编程语言之间的互通性、有利于学习掌握以及促进使用的熟练程度
B、模式表达式基本的语法与正则表达式很接近
C、是正则表达式的简化版本
D、模式表达式基本的语法与正则表达式很接近
2、实际上正则表达式对嵌套的配对支持非常糟糕。                  
A、实际上   B、表达式对    C、的配对     D、常糟糕
3、模式表达式基本的语法与正则表达。
A、证明                B、证明
C、时间                D、证明        
4、模式表达式基本的语法与正则表达式很接近        
A、一天              B、七天
C、通知        
"

var m = {};
for i in string.gmatch( str,"()(\d+、)") {
    table.push( m, i );
}

import console;
for(i=1;#m;1){
    console.log( string.sub(str,m[ i ],m[i+1]?m[i+1]-1) )
    console.more(1)
}

console.pause();




SysRq 发表于 2015-11-26 00:35:29

谢谢版主!又让我学了一个新知识。

谢谢版主!又让我学了一个新知识。
SysRq 发表于 2015-11-26 22:02:26

为什么加上一个()就可以返回该字符的位置呢

为什么加上一个()就可以返回该字符的位置呢
quicker 发表于 2015-11-26 23:00:26

[quote][size=2][url=forum.php?mod=redirect&goto=findpost&pid=70372&ptid=13136][c

SysRq 发表于 2015-11-26 22:02
为什么加上一个()就可以返回该字符的位置呢

可以参考帮助文档的模式匹配语法,一对空的()表示把匹配的位置作为一个匹配分组返回,其实那上面的代码已经演示的很清楚了。估计后面的代码你也没看懂才会这样问,基础的知识很重要,基础弄明白了,很多难题都可以迎刃而解。
SysRq 发表于 2015-11-27 19:25:37

[quote][size=2][url=forum.php?mod=redirect&goto=findpost&pid=70375&ptid=13136][c

quicker 发表于 2015-11-26 23:00
可以参考帮助文档的模式匹配语法,一对空的()表示把匹配的位置作为一个匹配分组返回,其实那上面的代码已 ...

谢谢版主
auaau 发表于 2015-11-28 00:14:17

你的模式匹配简化下就是:[quote][align=left][font=新宋体][color=#800000]"([b]\d+、[/b].*?)[b]\d+、

你的模式匹配简化下就是:
"(\d+、.*?)\d+、"

也就是从 \d+、 匹配到\d+、
\d+匹配的一个以上的数字,那么实际匹配结果就是两个:
从 "1、...到... 2、"
你在上面第一个结果里再用括号分组,把最后面的 ”2、“丢弃不显示
从 "3、...到... 4、"
同样你在上面第二个结果里再用括号分组,把后面的”4、“丢弃不显示

虽然如此,整段字符串里满足你的条件的匹配实际上就只有两个,并非4个结果。

auaau 发表于 2015-11-28 00:44:50

看样子你想匹配的条件确是 [quote][align=left][font=新宋体][color=#800000]"(\d+、.*?)[/color][b][

看样子你想匹配的条件确是
"(\d+、.*?)\d+、"
但是你希望在找到 从 "1、...到... 2、" 这个匹配结果以后,
再退回到 "2、" 的前面。

也就是说你的模式表达式中最后一个"\d+、" 你只是想做一个测试,并不想占用字符宽度,也就是正则表达式中的“零宽断言”

在aardio模式匹配中的“分界修饰符”实际上包含“零宽断言”的功能,
分界修饰符”实际上就是在模式元前面加一个感叹号,分界只是做一个检测并不占用任何字符宽度,他相当于正则中的两个零宽断言组合起来的效果。


所以所你的模式表达式中尾部的"\d+、" 改为 "!<\d+、>" 就可以实现你想要的效果了。
"!"后面必须是模式匹配中的最小单位 - 也就是模式元,所以上面用了一对尖括号,详细的看文档。


最后,附上完整的示例:
  1. var str = "
  2. 1、第一段:下次提问时希望楼主简化一下代码,
  3. 2、第二段:大段的随手复制内容不如具体讲一下文本的格式
  4. 3、第三段:例如每段都是任意字符,序号是一个或多个数字,后面跟一个顿号,有没有可能出现空格等等。
  5. 4、第四段:不要浪费每一个字的空间,至少我自己向别人求助就是是这样,麻烦别人占用别人的时间已经很不安,能让别人少浪费一毫秒少看一个无关的字或信息都会尽力去做。
  6. "

  7. import console;
  8. for s in string.gmatch( str,"\d+、.*?!<\d+、>") {
  9.         console.log(s);
  10.         console.more(1);
  11. }
复制代码


SysRq 发表于 2015-11-28 20:58:44

[quote][size=2][url=forum.php?mod=redirect&goto=findpost&pid=70387&ptid=13136][c

auaau 发表于 2015-11-28 00:44
看样子你想匹配的条件确是
但是你希望在找到 从 "1、...到... 2、" 这个匹配结果以后,再退回到 "2、" 的 ...

谢谢这就是我想要的结果
SysRq 发表于 2015-11-28 21:05:46

[quote][size=2][url=forum.php?mod=redirect&goto=findpost&pid=70387&ptid=13136][c

auaau 发表于 2015-11-28 00:44
看样子你想匹配的条件确是
但是你希望在找到 从 "1、...到... 2、" 这个匹配结果以后,再退回到 "2、" 的 ...

非常感谢你 解释的非常详细 我帮助文档没吃透不好意思。
xuefu3858 发表于 2016-12-5 08:22:59
我一直对匹配搞不懂,学习了
oliverpep 发表于 2017-6-16 16:16:57
auaau 发表于 2015-11-28 00:44
看样子你想匹配的条件确是
但是你希望在找到 从 "1、...到... 2、" 这个匹配结果以后,再退回到 "2、" 的 ...

这个例子正好便于理解帮助文档,太好了

手机版|未经许可严禁引用或转载本站文章|站长邮箱|aardio.com|aardio官方社区 ( 皖ICP备09012014号 )

GMT+8, 2017-11-23 20:53 , Processed in 0.062500 second(s), 18 queries , WinCache On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表