使用ruby scan split join with regex

我有这个字符串:

@string = "Hello.My email is james@email.com and my name is James." 

我想在句号和大写字母之间添加一个空格。 我想将@string更改为:

 "Hello. My email is james@email.com and my name is James." 

我有以下代码:

 @string.scan(/.[AZ]/) # => [".M"] 

匹配一个. 你需要使用转义点。 您还需要使用gsub ,而不是scan因为您需要执行替换操作。

使用

 s = "Hello.My email is james@email.com and my name is James." s = s.gsub(/\.\K(?=[[:upper:]])/, ' ') 

查看Ruby演示 。 仍然允许连续匹配的捕获组变体:

 s = s.gsub(/(\.)(?=[[:upper:]])/, '\1 ') 

或者看后面一个:

 s = s.gsub(/(?<=\.)(?=[[:upper:]])/, ' ') 

细节

  • \. - 一个字面点
  • \K - 匹配重置运算符( (?<=\.)等于\.\K in function)
  • (?=[[:upper:]]) - 一个正向前瞻,要求在当前位置的右侧立即出现一个大写字母。

在基于捕获组的模式中, (\.)组1, \1在替换时插入值。

这是一种处理US的方式:

 s = "Hello.My email is james@email.com and my name is MBS James." rx = /(\b[[:upper:]](?:\.[[:upper:]])+)\b|\.([[:upper:]])/ puts s.gsub(rx) { |m| m == $~[1] ? $~[1] : ". #{$~[2]}" } 

看另一个Ruby演示

这里,

  • \b([[:upper:]](?:\.[[:upper:]])+)\b - 单个大写字母后跟1个或多个. + 1个或更多大写字母,捕获到组1中。
  • | - 要么
  • \.([[:upper:]]) - 一个点和大写字母捕获到第2组。

如果组1匹配,则插入$~[1] (组1值),否则. 用于替换。 请注意, $~gsub当前使用的匹配数据对象, $~[N]是Group N值。

你可以使用gsub

 @string = "Hello.My email is james@email.com and my name is James." @string.gsub!(/(\.)([AZ])/, '\1 \2') 

输出:

 "Hello. My email is james@email.com and my name is James." 

更新:

另一个好方法是使用积极的前瞻,感谢@CarySwoveland建议

 @string = "Hello.My email is james@email.com and my name is James." @string.gsub(/\.(?=[AZ])/, '. ')