我有这个字符串:
@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"]
答案 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]}"
}
下面,
\b([[:upper:]](?:\.[[:upper:]])+)\b
- 一个大写字母后跟一个或多个.
+ 1个或更多大写字母,被捕获到第1组。|
- 或\.([[:upper:]])
- 一个点和大写字母捕获到第2组。如果组1匹配,则插入$~[1]
(组1值),否则使用.
进行替换。请注意,$~
是gsub
中当前使用的匹配数据对象,而$~[N]
是组N值。