记得在 lisp 中 1 + 2 + 3 好像是可以写成:(+ 1 2 3)
#14 楼 @ad583255925 那个是测试正则程序是否可以处理属性中的 大于或小于号,不能让正则在那个地方识别为 tag 结束。
#12 楼 @ad583255925 你确定瓶颈在哪个正则上吗·?我在我的 macbook pro 机器上跑了下,哪个替换过程所花的时间非常少。
你要实现将 HTML 中的特定文本替换掉?
code =<<-EOF
xyz<p><img src='www.xyz.com'/>xyz我需要的内容</p>xyz
<div id="xyz" data-tag="xzy">xyz我需要的内容</div>
<input type="text" readonly/>
<br/><hr/>
<div data-cont="$1 > $2"></div>
<div data-cont=' "$1" >= "$2" '>随便内容</div>
EOF
reg = %r{
( </?
(?:
[^<>"']*
| ' (?: [^'\\] | \\.)* '
| " (?: [^"\\] | \\.)* "
)*?
/?>
)
| ( [^<>]* )
}x
puts code.gsub(reg) {|m| $1 ? $1 : $2.gsub(/xyz/, '') }
code =<<-EOF
xyz<p><img src='www.xyz.com'/>xyz</p>xyz
<div id="xyz" data-tag="xzy">xyz</div>
<input type="text" readonly/>
<br/><hr/>
<div data-cont="$1 > $2"></div>
<div data-cont=' "$1" >= "$2" '></div>
EOF
reg = %r{
( </? # tag start
(?: # tag properties
[^<>"']* # 不含引号、> 、<的内容
| ' (?: [^'\\] | \\.)* ' # 引号内的内容,可以包含> 、<
| " (?: [^"\\] | \\.)* "
)*?
/?> # tag end
)
| ( [^<>]* )
}x
puts code.gsub(reg) {|m| $1 ? $1 : '' }
我一直这么写
str =<<-EOF.gsub(/^[ ]{4}/, '')
I know I know
You will like it.
special in this case!
or in this case
content!
EOF
puts str
当然这种只能处理没有 tab 的情况,如果是 tab 和空格的混合情况就比较麻烦了。因为自己平时的编辑器会自动 将 Tab 换成空格所以用这个带处理问题不大
对于服务器来说没有什么登陆不登陆的,只有 header 中是否含有合适的 cookie。抓包下能够正常的上传的程序的 http 包,把他的 header 复制下来就可以了
puts "1,2,3,4,5.exe".gsub(/,[^,]*$/, '')
多交代一些你具体的需要。这样大家才可以帮你想办法。你的 RTF 文件从哪来的?为什么要转化而不是直接生成 html 格式?还有就是你转化的频率有多高,是自己用还是公司用。如果是自己用的话可以考虑用一些在线的 web 服务来做
好东西吗,也许用得着,先收藏下,中午研究下
你的正则用了排除法,这样写很容易出问题的,你应该只描述允许的字符
不是正则的问题,是你读数据的时候没有正常编码
s = IO.read(filename, :open_args => ['r:utf-8'])
楼上的不够健壮,多一些空格就误判了,而且没必要使用反向环视
r = %r{
(\D) \s* # 行末的最后一个非空白字符不能是数字
(?= ^ \s* \D) # 另一行第一个非空白字符不能是数字
}x
puts s.gsub(r, '\1 ')
感觉还是 resutfull api 比较可行,用运行命令的方式来做感觉可靠性太差。
还是 1 楼的方法好,to_i 比正则高效的多,对 Ruby 内置的函数还不是很熟悉
上面那个太啰嗦了,应该可以简化下
a = %w{ 1F B2 B1 B4 B3 2F 10F 11F 3F }
a.sort! do |i1, i2|
n1 = i1.sub(/[BF]/, {'F' => 0, 'B' => '-'}).to_i
n2 = i2.sub(/[BF]/, {'F' => 0, 'B' => '-'}).to_i
n1 < n2 ? -1 : 1
end
a = %w{ 1F B2 B1 B4 B3 2F 10F 11F 3F }
a.sort! do |i1, i2|
is_b1 = i1.start_with? 'B'
is_b2 = i2.start_with? 'B'
n1 = i1.sub(/[a-z]/i, '').to_i
n2 = i2.sub(/[a-z]/i, '').to_i
case
when is_b1 != is_b2 then is_b1 ? -1 : 1
when is_b1 && is_b2 then n1 < n2 ? 1 : -1
else n1 < n2 ? -1 : 1
end
end
puts a
多谢@luikore的指点。查了下资料,ruby 的官方文档中确实有这样的描述: *Note: A regexp can't use named backreferences and numbered backreferences simultaneously. * 因此最后做的那个处理在使用命名组的时候确实有点没有必要了,不过在非命名捕获的情况下还是有必要的。至于?: 更多的是个人习惯。因为本身是做前端的,JS 中是不支持命名组的,所以习惯了尽可能少的减少捕获分组的个数