3

使用 Ruby 我正在尝试使用正则表达式拆分以下文本

~foo\~\=bar =cheese~monkey

其中 ~ 或 = 表示匹配的开始,除非它用 \ 转义

所以它应该匹配

~foo\~\=bar

然后

=cheese

然后

~monkey

我认为以下内容会起作用,但事实并非如此。

([~=]([^~=]|\\=|\\~)+)(.*)

什么是更好的正则表达式?

编辑更具体地说,上面的正则表达式匹配所有出现的 = 和 ~

编辑工作解决方案。这是我想出的解决问题的方法。我发现 Ruby 1.8 具有前瞻功能,但没有后瞻功能。所以看了一圈之后,我在 comp.lang.ruby 中看到了这篇文章,并用以下内容完成了它:

# 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
4

1 回答 1

4

在这种情况下,“去掉头”是什么意思?

如果您想删除某个字符之前的所有内容,可以这样做:

.*?(?<!\\)=      // 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"
于 2008-12-15T15:30:38.687 回答