使用Ruby我试图用正则表达式分割以下文本
~foo\~\=bar =cheese~monkey
其中〜或=表示匹配的开始,除非使用\
进行转义所以它应匹配
~foo\~\=bar
然后
=cheese
然后
~monkey
我认为以下内容可行,但事实并非如此。
([~=]([^~=]|\\=|\\~)+)(.*)
使用什么更好的正则表达式?
编辑更具体地说,上面的正则表达式匹配所有出现的=和〜
修改工作解决方案。以下是我提出的解决问题的方法。我发现Ruby 1.8已经展望未来,但没有外观功能。所以在看了一下之后,我在comp.lang.ruby中遇到了this post并用以下内容完成了它:
# Iterates through the answer clauses
def split_apart clauses
reg = Regexp.new('.*?(?:[~=])(?!\\\\)', Regexp::MULTILINE)
# need to use reverse since Ruby 1.8 has look ahead, but not look behind
matches = clauses.reverse.scan(reg).reverse.map {|clause| clause.strip.reverse}
matches.each do |match|
yield match
end
end
答案 0 :(得分:4)
在这种情况下,“删除头部”是什么意思?
如果你想删除某个char之前的所有内容,可以这样做:
.*?(?<!\\)= // anything up to the first "=" that is not preceded by "\"
.*?(?<!\\)~ // same, but for the squiggly "~"
.*?(?<!\\)(?=~) // same, but excluding the separator itself (if you need that)
替换为“”,重复,完成。
如果您的字符串只有三个元素("1=2~3"
)并且您希望一次匹配所有元素,则可以使用:
^(.*?(?<!\\)(?:=))(.*?(?<!\\)(?:~))(.*)$
matches: \~foo\~\=bar =cheese~monkey
| 1 | 2 | 3 |
或者,您使用此正则表达式分割字符串:
(?<!\\)[=~]
returns: ['\~foo\~\=bar ', 'cheese', 'monkey'] for "\~foo\~\=bar =cheese~monkey"
returns: ['', 'foo\~\=bar ', 'cheese', 'monkey'] for "~foo\~\=bar =cheese~monkey"