Regex/Ruby-分割保留分隔符
我需要拆分一个包含变量/分隔符的字符串,类似于 “您好%Customer Name%您的订单号是%order number%,很快就会送达” 使用Regex/Ruby-分割保留分隔符,regex,ruby,Regex,Ruby,我需要拆分一个包含变量/分隔符的字符串,类似于 “您好%Customer Name%您的订单号是%order number%,很快就会送达” 使用 string.split(/%/) => ["Hello ", "Customer Name", " your order number is ", "Order Number", " and will be delivered soon"]
string.split(/%/)
=> ["Hello ", "Customer Name", " your order number is ", "Order Number", " and will be delivered soon"]
这接近要求,但我正在努力达到
["Hello ", "%Customer Name%", " your order number is ", "%Order Number%", " and will be delivered soon"]
因此,本质上我需要在%处拆分,但将其保留在返回的字段中。我尝试了使用正则表达式进行“向前看/向后看”,但没有完全正确。您可以使用类似的模式
/(%[^%]*%)/
根据文件:
如果模式包含组,那么相应的匹配项也将在数组中返回
请参阅,它匹配并捕获组1中的%
字符,然后是%
以外的任何0个或更多字符,然后是%
见a:
这里有三种方法可以做到
str = "%Hello% dear %Cust Name% %your order %Order Nbr% was %lost%"
1。使用
也许
s.split(/([^%]*%)/)
可以吗?像(?=%\s)|(?@WiktorStribiżew,这很聪明,因为当使用正则表达式捕获组时,所有捕获的组都包含在结果中=)@WiktorStribiżew这非常有效,谢谢@avsq1如果答案解决了您的问题,请点击✓ 在它的左边。请注意,您得到2个接受解决方案。请注意%hello%world.split(/([^%]*%)/)#=>[“”、“%hello%”、“world”]
@CarySwoveland这是应该预料到的,这就是正则表达式拆分与捕获组的工作方式。如果OP不希望结果中出现空项。
str = "%Hello% dear %Cust Name% %your order %Order Nbr% was %lost%"
r = /
(?<= # begin positive lookbehind
\A # match beginning of string
| # or
[ ] # match a space
) # end positive lookbehind
(?=%) # positive lookahead asserts next char is '%'
| # or
(?<=%) # positive lookbehind asserts previous char is '%'
(?= # begin a positive lookahead
[ ] # match a space
| # or
\z # match end of string
) # end positive lookahead
/x # free-spacing regex definition mode
str.split r
#=> ["%Hello%", " dear ", "%Cust Name%", " ", "%your%", " order ",
# "%Order Nbr%", " was ", "%lost%"]
r = /
%[^%]*% # match '%', 0+ chars other than '%', '%'
| # or
(?: # begin non-capture group#
(?<=\A) # positive lookbehind asserts at beginning of string
| # or
(?<=%) # positive lookbehind asserts previous char is '%'
(?=[ ]) # positive lookahead asserts next char is a space
) # end non-capture group
[^%]* # match 0+ chars other than '%'
(?= # begin positive lookahead
\z # match end of string
| # or
(?<=[ ]) # assert previous char is a space
% # match '%'
) # end positive lookahead
/x # free-spacing regex definition mode
str.scan r
#=> ["%Hello%", " dear ", "%Cust Name%", " ", "%your%", " order ",
# "%Order Nbr%", " was ", "%lost%"]
str.each_char.slice_when { |a,b|
(a == ' ') & (b == '%') || (a == '%') & (b == ' ') }.map(&:join)
#=> ["%Hello%", " dear ", "%Cust Name%", " ", "%your%", " order ",
# "%Order Nbr%", " was ", "%lost%"]