Project1

标题: 请教一个问题关于正则表达式 [打印本页]

作者: 赛露休斯    时间: 2011-9-22 17:17
标题: 请教一个问题关于正则表达式
"a:34c,a:8q57,a:1/3,a:?37"
1、如何获取第3个a:到,之间的值(就是1/3,之前什么的34c都是不确定值)
2、1/3是在第3个a:后面,已知1/3如何返回前面a:的次数?(这里是3)dsu_plus_rewardpost_czw
作者: fux2    时间: 2011-9-22 17:36
本帖最后由 fux2 于 2011-9-22 17:37 编辑
  1. "a:34c,a:8q57,a:1/3,a:?37".gsub(/a:(.*),/){$1+"●"}.split(/●/)
复制代码
然后数组你懂的吧,手机没测试,不知对错
作者: darkscout3000    时间: 2011-9-23 02:26
本帖最后由 darkscout3000 于 2011-9-22 13:27 编辑

2L 的结果出来是
  1. ["a:34c,a:8q57,a:1/3,", "a:?37"]
复制代码
正则表达式用 .* 很容易就匹配到最后面去了,因为 .* 是匹配任何东西

这个是1/3
  1. "a:34c,a:8q57,a:1/3,a:?37".gsub(/a:/, '').split(",")[2]
复制代码

作者: fux2    时间: 2011-9-23 07:33
本帖最后由 fux2 于 2011-9-23 07:34 编辑
darkscout3000 发表于 2011-9-23 02:26
2L 的结果出来是正则表达式用 .* 很容易就匹配到最后面去了,因为 .* 是匹配任何东西

这个是1/3 ...


呵,那如果.*里包含,呢?
  1. "a:34c,a:8q57,a:1/3,a:?37".gsub(/a:([^a:]),/){$1+"●"}.split(/●/)
复制代码

作者: 赛露休斯    时间: 2011-9-23 20:15
关键是第二步,已经获得了1/3的情况下返回a:的编号,比如上面是在第3个a:后面的,就返回3
另外如果要返回1/前面的a:的编号呢?
作者: darkscout3000    时间: 2011-9-23 21:31
fux2 发表于 2011-9-22 18:33
呵,那如果.*里包含,呢?

呵呵,你自己试试就知道了,结果非常震惊⋯⋯


darkscout3000于2011-9-23 08:34补充以下内容:
如果我没理解错的话你的意思是知道1/3是第几个a: 后面的是吧?那样的话⋯⋯
  1. 如果我没理解错的话你的意思是知道1/3是第几个a: 后面的是吧?那样的话⋯⋯
  2. "a:34c,a:8q57,a:1/3,a:?37".gsub(/a:/, '').split(",").index("1/3")
复制代码
这样给出来的结果是2(因为数组永远从0开始算),你+1就好了
作者: 英顺的马甲    时间: 2011-9-23 21:54
正则表达式参考
http://deerchao.net/tutorials/regex/regex.htm
http://www.regexlab.com/zh/regref.htm
http://dragon.cnblogs.com/archive/2006/05/08/394078.html
作者: 赛露休斯    时间: 2011-9-24 17:32
darkscout3000 发表于 2011-9-23 21:31
呵呵,你自己试试就知道了,结果非常震惊⋯⋯

这个例子其实我想举的是如果匹配某个关键字怎么返回它的次数,因为要匹配文章里的某些关键字。用split后被分割成了数组,里面的字符串都是一大段一大段,要匹配的是里面的某些关键字。。。
现在是如果把匹配 1/3 改成匹配 / ,也就是找到 / 然后找是在第几个a:后面的,这样的话该怎么办?
作者: darkscout3000    时间: 2011-9-25 11:39
赛露休斯 发表于 2011-9-24 04:32
这个例子其实我想举的是如果匹配某个关键字怎么返回它的次数,因为要匹配文章里的某些关键字。用split后 ...

能找到1/3,自然也能找到 /
你把我给你的那段代码里头最后的1/3 改成 / 就好了……
对于其他的字符串同理……

如果你想知道有多少次匹配成功……
  1. "a:34c,a:8q57,a:1/3,a:?37".scan(/1\/3/).size
复制代码
这样会返回 1 (注意 1/3 的斜杠需要在前面添加 \ 符号)

举例说明
  1. "abc, abcdef, abccddef".scan(/abc/).size
复制代码
的结果是3
作者: 赛露休斯    时间: 2011-9-25 18:53
darkscout3000 发表于 2011-9-25 11:39
能找到1/3,自然也能找到 /
你把我给你的那段代码里头最后的1/3 改成 / 就好了……
对于其他的字符串同理 ...
  1. "a:34c,a:8q57,a:1/3,a:?37".gsub(/a:/, '').split(",").index("/")
复制代码
如果 1/3 改成 / 返回nil
另外,index(val)里面参数貌似是数组的值,比如这里是1/3,换成 / 就找不到了
作者: darkscout3000    时间: 2011-9-26 23:10
赛露休斯 发表于 2011-9-25 05:53
如果 1/3 改成 / 返回nil
另外,index(val)里面参数貌似是数组的值,比如这里是1/3,换成 / 就找不到了 ...

啊,对哦,不好意思,我疏忽了

那你试试
  1. results = "a:34c,a:8q57,a:1/3,a:?37".gsub(/a:/, '').split(",")
  2. results.each_index { |index|
  3.     return index if (results[index] =~ /\//)
  4. }
复制代码
这个返回的index应该是你想要的
作者: 赛露休斯    时间: 2011-9-27 19:41
darkscout3000 发表于 2011-9-26 23:10
啊,对哦,不好意思,我疏忽了

那你试试这个返回的index应该是你想要的 ...

运行报错,说是LocalJumpError,似乎是return这边出错





欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1