2017-01-02 70 views
2

寻找写入正则表达式的帮助,以捕获特定字符串是否以特定字符串开头并捕获开始字符串和剩余字符串。假设字符串可能的开头是'P','RO','RPX',并且示例字符串是'PIXR'或'ROXP'或'RPX'。 我期待它是否与给定的可能的字符串,例如 “PIXRT” =〜//输出“P”和“IXRT”正则表达式在字符串开头捕获某些单词Ruby

不是很熟悉开始写捕获的开始和字符串的结尾部分的正则表达式正则表达式,所以任何帮助真的很感激。

回答

4

您可以使用正则表达式与2个捕获组,一个在开始捕获已知值,其余的将捕捉到字符串的其余部分:

rx = /\A(RPX|RO|P)(.*)/m 
"PIXRT".scan(rx) 
# => [P, IXRT] 

Ruby demo

详细

  • \A - 字符串的开始
  • (RPX|RO|P) - 即必须在字符串的开头的一个值(考虑到这些替代品的顺序:较长的是第一位的!)
  • (.*) - 任何0+字符到字符串的结尾(m修饰符也会使.匹配换行符)。
1
def split_after_start_string(str, *start_strings) 
    a = str.split(/(?<=\A#{start_strings.join('|')})/) 
    if a.size == 2 
    a 
    elsif start_strings.include?(str) 
    a << '' 
    else 
    nil 
    end 
end 

start_strings = %w| P RO RPX |     #=> ["P", "RO", "RPX"] 

split_after_start_string('PIXR', *start_strings) #=> ["P", "IXR"] 
split_after_start_string('IPXR', *start_strings) #=> nil 
split_after_start_string('ROXP', *start_strings) #=> ["RO", "XP"] 
split_after_start_string('RPX', *start_strings) #=> ["RPX", ""] 

正则表达式写道:“在积极的回顾后的字符串的开头匹配的start_stringx一个元素”。对于smart_strings的例子,正则表达式是:

/(?<=\A#{start_strings.join('|')})/    #=> /(?<=\AP|RO|RPX)/ 
相关问题