2017-01-02 69 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)/ 
相關問題