我的字符串分隔符是;。分隔符在字符串中转义为\;。例如。,

irb(main):018:0> s = "a;b;;d\\;e"
=> "a;b;;d\\;e"
irb(main):019:0> s.split(';')
=> ["a", "b", "", "d\\", "e"]

有人能建议我使用regex,这样split的输出就会["a", "b", "", "d\\;e"]?我用的是Ruby1.8.7

最佳答案

1.8.7如果没有Oniguruma(可以在中编译),则没有负lookbehind。
1.9;YA:

> s = "a;b;c\\;d"
=> "a;b;c\\;d"
> s.split /(?<!\\);/
=> ["a", "b", "c\\;d"]

1.8.7使用oniguruma并不能提供一个简单的分割,但是您可以得到匹配偏移量并以这种方式分割子字符串。我想有更好的方法来做这件事我不记得了:
> require 'oniguruma'
> re = Oniguruma::ORegexp.new "(?<!\\\\);"
> s = "hello;there\\;nope;yestho"
> re.match_all s
=> [#<MatchData ";">, #<MatchData ";">]
> mds = re.match_all s
=> [#<MatchData ";">, #<MatchData ";">]
> mds.collect {|md| md.offset}
=> [[5, 6], [17, 18]]

其他选项包括:
拆分;并对结果进行后处理以查找后续\\,或
执行char-by-char循环并保持一些简单的状态,然后手动拆分。

09-25 17:54