使用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])/, '. ')