Project1

标题: 【一个正则求教】 [打印本页]

作者: 我为鱼肉    时间: 2022-8-16 09:01
标题: 【一个正则求教】
本帖最后由 我为鱼肉 于 2022-8-16 09:01 编辑

在字符串中找到<>里的内容,具体是这样的
<任意文本[数字-数字]任意文本[数字-数字]任意文本>
找出<>中的内容
str =~ /<(.+)>/
继续
$~.captures.delete(nil).each do |s|
s =~ /\[([0-9]+)-([0-9]+)\]/
end

这么做确实应该可以匹配到数字,但是不知道怎么输出具体的字符串
比如说 字符串 "字符[1-4]字符[1-4]字符"
我现在要把他还原为  字符1字符1字符,字符1字符2字符,字符1字符3字符,字符1字符4字符,字符2字符1字符,字符2字符2字符等等
该怎么做?
作者: 纯属小虫    时间: 2022-8-16 11:15
本帖最后由 纯属小虫 于 2022-8-17 15:36 编辑

<字符串1[数字1_1 - 数字1_2]字符串2[数字2_1 - 数字2_2]字符串3>
s =~/(.*?)\[(\d+)-\(d+)\](.*?)\[(\d+)-(\d+)\](.*?)/
字符串1 = $1
数字1_1 = $2
数字1_2 = $3
字符串2 = $4
数字2_1 = $5
数字2_2 = $6
字符串3 = $7

如果要增加容错率,比如避免数字间按了空格导致匹配失败的情况,可以用这个
s =~/(.*?)\[\s+(\d+)\s+[-]\s+(\d+)\s+\](.*?)\[\s+(\d+)\s+[-]\s+(\d+)\s+\](.*?)/


(应该没错....吧....)


这个网站的正则挺全的,初学可以看看~
https://r2coding.com/#/README?id ... f%e6%9f%a5%e8%a1%a8
作者: 我为鱼肉    时间: 2022-8-16 12:11
纯属小虫 发表于 2022-8-16 11:15
s =~/(.*?)\[(\d+)-\(d+)\](.*?)\[(\d+)-(\d+)\](.*?)/
字符串1 = $1
数字1_1 = $2

可以了
如果只写   \s+ 那就是必须要存在空白
(\s+)?  这样的话就是有没有空白,有多少空白都没关系了
作者: RPGzh500223    时间: 2022-8-17 10:53
本帖最后由 RPGzh500223 于 2022-8-17 11:06 编辑

如果很严(简)格(单)的格式(字符为单字节字符,数字只是0到9)
str = "<A[1-2]b[3-4]C>"
chr1, num1, num2, chr2, num3, num4, chr3 = str.unpack('xaxCxCxaxCxCxa').map!{|i| Integer === i ? i - 48 : i }

并不推荐这么做,效率比正则稍慢……
Ruby本来就灵活,还可以eval,<>之间写成代码的形式,这个就更不推荐了






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