如何编写一个检查两个或更多字符的前瞻性正则表达式?

时间:2014-04-13 00:18:18

标签: ruby-on-rails ruby regex

我有这样的字符串:

str = "Word word ReplaceThis DONT word word"

我只想替换ReplaceThis ,只有当它没有后跟两个或更多大写字母时(在此示例中为DONT)。

如何在我的正则表达式中编写一个前瞻来处理它?这是我尝试过的:

str.sub!(/\bReplaceThis\b/i, "NewWord"

4 个答案:

答案 0 :(得分:2)

user3188544,这可能是您正在寻找的简单答案:

replace = str.gsub(/ReplaceThis(?!\s?[A-Z]{2})/, 'NewWord')

答案 1 :(得分:0)

您可以使用如下所示的捕获组,而不是前瞻或后方:

another_str = "Please ReplaceThis now"  
another_str.gsub(/(ReplaceThis) (?=[A-za-z][^A-Z]{1,})/, 'NewWord \2')
#=> "Please NewWord now"

str = "Word word ReplaceThis DONT word word"
str.gsub(/(ReplaceThis) (?=[A-za-z][^A-Z]{1,})/, 'NewWord \2')
#=> "Word word ReplaceThis DONT word word"

Capture Group与Positive lookahead解决方案结合使用:

str = "Word word ReplaceThis DONT word word"
str.gsub(/(ReplaceThis) (?=[A-za-z][^A-Z]{1,})/, 'NewWord \2')
#=> "Word word ReplaceThis DONT word word"

another_str = "Please ReplaceThis now" 
another_str.gsub(/(ReplaceThis) (?=[A-za-z][^A-Z]{1,})/, 'NewWord \2')
#=> "Please NewWord now"

答案 2 :(得分:0)

result = re.sub(r"(?s)\bReplaceThis\b\s+(?![A-Z]{2,})", "newword", subject)

答案 3 :(得分:0)

这种模式使用积极的前瞻:

(ReplaceThis)(?=\s[a-z]{2}+)

<强>代码:

replace = searchText.gsub(/(ReplaceThis)(?=\s[a-z]{2}+)/x, "NewWord")

示例:

http://regex101.com/r/lX8mF8