Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex/Ruby-分割保留分隔符_Regex_Ruby - Fatal编程技术网

Regex/Ruby-分割保留分隔符

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"]

我需要拆分一个包含变量/分隔符的字符串,类似于

“您好%Customer Name%您的订单号是%order number%,很快就会送达”

使用

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%"]