搜索
查看: 697|回复: 9
打印 上一主题 下一主题

条件表达式模式匹配问题

[复制链接]

12

主题

112

帖子

872

积分

三级会员

Rank: 4

积分
872
跳转到指定楼层
楼主
发表于 2017-3-18 21:29:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 ejzhang 于 2017-3-18 21:34 编辑

模式匹配条件表达式,表达式以“=、<、>、<=、>=、!=、<>”开始(可省略),后跟数字或字符串。
各模式单独测试都可以,放到一起就匹配不到,请帮忙看一下怎么修改,谢谢!
现在有两个问题:
1、“(=|\<|\>|<\<=>|<\>=>|<!=>|<\<\>>)”怎么匹配0次或1次?在后面加“?”就无法匹配了;
2、“<-?\d+>”和“%''”单独匹配都可以,用“|”放在一起就不行了。
回复

使用道具 举报

12

主题

112

帖子

872

积分

三级会员

Rank: 4

积分
872
沙发
 楼主| 发表于 2017-3-18 21:32:03 | 只看该作者
  1. for (k,v in {"123";"-234";"=345";"<=456";">=567";"!=678";"<>789";"='sde'";"!='jhi'"}){
  2.     console.log( v, "=>", string.find( v, `^(=|\<|\>|<\<=>|<\>=>|<!=>|<\<\>>)\s*(<-?\d+>)\s* ) );
  3.     console.log( v, "=>", string.find( v, `^(=|\<|\>|<\<=>|<\>=>|<!=>|<\<\>>)\s*(%'')\s* ) );
  4.     console.log( v, "=>", string.find( v, `^(=|\<|\>|<\<=>|<\>=>|<!=>|<\<\>>)\s*(<-?\d+>|%'')\s* ) );
  5. }
复制代码
回复

使用道具 举报

12

主题

112

帖子

872

积分

三级会员

Rank: 4

积分
872
板凳
 楼主| 发表于 2017-3-18 23:04:29 | 只看该作者
本帖最后由 ejzhang 于 2017-3-18 23:08 编辑
  1. import console;

  2. for (k,v in {"123";"-234";"=345";"<=456";">=567";"!=678";"<>789";"='sde'";"!='jhi'"}){
  3.     console.log( v, "=>", string.find( v, "^(=|\<|\>|<\<=>|<\>=>|<!=>|<\<\>>)\s*(<-?\d+>)\s*$" ) );
  4.     console.log( v, "=>", string.find( v, "^(=|\<|\>|<\<=>|<\>=>|<!=>|<\<\>>)\s*(%'')\s*$" ) );
  5.     console.log( v, "=>", string.find( v, "^(=|\<|\>|<\<=>|<\>=>|<!=>|<\<\>>)\s*(<-?\d+>|%'')\s*$" ) );
  6. }

  7. console.pause();
复制代码
回复

使用道具 举报

16

主题

91

帖子

685

积分

三级会员

Rank: 4

积分
685
QQ
地板
发表于 2017-3-20 09:12:12 | 只看该作者
你这匹配的太繁琐了,你要匹配什么结果?
回复

使用道具 举报

12

主题

112

帖子

872

积分

三级会员

Rank: 4

积分
872
5#
 楼主| 发表于 2017-3-20 09:21:34 | 只看该作者
lm752213730 发表于 2017-3-20 09:12
你这匹配的太繁琐了,你要匹配什么结果?

我想匹配以“=、<、>、<=、>=、!=、<>”开头(可以没有),数字或字符串结尾的结果,就是匹配123、=234、<=345、'abc'、!='def'这样的字符串。
回复

使用道具 举报

12

主题

112

帖子

872

积分

三级会员

Rank: 4

积分
872
6#
 楼主| 发表于 2017-3-20 10:19:27 | 只看该作者
本帖最后由 ejzhang 于 2017-3-20 10:25 编辑

继续发现问题,为什么单独的“<”、“>”和“!”无法匹配?
  1. import console;

  2. for (k,v in {"=";"!=";"<";"<=";">";">=";"<>"}){
  3.     console.log( v, "=>", string.find( v, `<@<>@>|<[><!]?=>` ) );
  4. }

  5. console.pause();
复制代码
回复

使用道具 举报

16

主题

91

帖子

685

积分

三级会员

Rank: 4

积分
685
QQ
7#
发表于 2017-3-20 10:40:55 | 只看该作者
ejzhang 发表于 2017-3-20 10:19
继续发现问题,为什么单独的“”和“!”无法匹配?

因为你模式的第二段意思是 必须带有=
回复

使用道具 举报

16

主题

91

帖子

685

积分

三级会员

Rank: 4

积分
685
QQ
8#
发表于 2017-3-20 10:41:40 | 只看该作者
ejzhang 发表于 2017-3-20 10:19
继续发现问题,为什么单独的“”和“!”无法匹配?

把=放到[]里面就可以了
回复

使用道具 举报

12

主题

112

帖子

872

积分

三级会员

Rank: 4

积分
872
9#
 楼主| 发表于 2017-3-20 10:49:55 | 只看该作者
lm752213730 发表于 2017-3-20 10:41
把=放到[]里面就可以了

谢谢!我错了
回复

使用道具 举报

12

主题

112

帖子

872

积分

三级会员

Rank: 4

积分
872
10#
 楼主| 发表于 2017-3-20 13:28:20 | 只看该作者
通过两次模式匹配解决了。
  1. for (k,v in {"123";"-234";"=345";"<=456";">=567";"!=678";"<>789";"='sde'";"!='jhi'"}){
  2.     var symbol, value = string.match( v, "^[\s ]*(<@<>@>|<[!<>]=>|<[=<>]>)[\s ]*(<-?\d+>|<'[^']+'>)[\s ]*$" );
  3.     if ( !value ) value = string.match( v, "^[\s ]*(<-?\d+>|<'[^']+'>)[\s ]*$" );
  4.     console.log(k, v, symbol, value);
  5. }
  6. console.pause();
复制代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

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

GMT+8, 2017-9-25 19:06 , Processed in 0.062500 second(s), 18 queries , WinCache On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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