使用ruby scan split join with regex

时间:2017-10-23 19:46:35

标签: ruby 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(/.[A-Z]/)
# => [".M"]

2 个答案:

答案 0 :(得分:1)

您可以使用Etiqueta_Anomalia = GetEtiqueta_Anomalia(s, sa);

gsub

输出:

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

<强>更新

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

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

答案 1 :(得分:1)

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

使用

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

请参阅Ruby demo。仍然允许连续匹配的捕获组变体:

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

或者看后面的一个:

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

<强>详情

  • \. - 一个文字点
  • \K - 匹配重置运算符((?<=\.)在功能上等于\.\K
  • (?=[[:upper:]]) - 一个积极的前瞻,要求在当前位置的右侧立即显示一个大写字母。

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

以下是一种处理U.S.字样的方法:

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

请参阅another Ruby demo

下面,

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

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