2

给定的-我使用的是 Ruby 1.8.7,因此不能使用负面的后视。我也知道oniguruma,但我正在寻找没有它的解决方案。

如果我有:

foo = "string and string [foo and string stuff] string and strings foostring string"
w = "string"

我该如何修改这个:

foo.gsub(/\b#{w}\b/i) {|s| "[#{w}]"}

这样 [] 之间任何地方的“字符串”都不匹配,例如,所需的结果是:

"[string] and [string] [foo and string stuff] [string] and strings foostring [string]" 

谢谢!

4

2 回答 2

1

我无法证明你所要求的不能用一个正则表达式来完成,但我不相信这是可能的。但是,您可以通过以下方式完成它:

foo = "string and string [foo and string stuff] string and strings foostring string"
w = "string"

brackets = []
a = foo.gsub( /\[[^\]]+\]/ ){ |b| brackets << b; "-^#{brackets.length-1}^-" }
b = a.gsub(/\b#{w}\b/i) {|s| "[#{w}]" }
c = b.gsub( /-\^\d+\^-/ ){ |s| brackets[ s[/\d+/].to_i ] }

p a, b, c
#=> "string and string -^0^- string and strings foostring string"
#=> "[string] and [string] -^0^- [string] and strings foostring [string]"
#=> "[string] and [string] [foo and string stuff] [string] and strings foostring [string]"
于 2010-12-16T18:25:41.480 回答
1

如果您知道方括号将始终像在您的示例中那样以平衡的方式出现,您可以对单词后的不平衡右括号进行负前瞻。如果左括号不在单词之后,它必须单词之前。例子:

foo.gsub(/\b#{w}\b(?![^\[]*\])/) {|s| "[#{w}]"}

另一种选择是匹配一对括号和其中的所有内容,或者匹配目标字符串。如果它是您匹配的括号序列,则将其重新插入;否则,您将括号添加到匹配的字符串并将其插入在这种情况下,它甚至更简单:您可以捕获一组中括号的所有内容,或另一组中的目标字符串,然后使用元序列\+插入内容无论哪个组匹配,都添加了括号。例子:

foo.gsub(/\[([^\]\[]*)\]|(\b#{w}\b)/, '[\+]')

在ideone上看到他们的行动

于 2010-12-16T20:56:38.977 回答