2017-01-02 5 views
2

特定の文字列が特定の文字列で始まり、開始文字列と残りの文字列を取り込むかどうかを捕捉するための正規表現を作成します。例えば、文字列の先頭が 'P'、 'RO'、 'RPX'、サンプル文字列が 'PIXR'または 'ROXP'または 'RPX'であるとします。 は、私はそれが与えられた可能文字列例えば 「PIXRT」=〜//出力「P」とNot「IXRT」Regex too文字列の先頭に特定の単語を取り込みます。

に非常に精通して開始した場合に開始し、文字列の末尾の部分をキャプチャする正規表現を書くことを探していますregexesので、どんな助けも本当に感謝しています。

答えて

4

あなたは2つのキャプチャグループで正規表現を使用することができ、1がスタートし、安静時の既知の値をキャプチャすることは、文字列の残りの部分をキャプチャします:

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

詳細Ruby demo

を参照してください。 :

  • \A - 文字列の先頭
  • (RPX|RO|P) - 文字列の先頭でなければならない値(これらの選択肢の順番を気に!:長いものが最初に来る)の1
  • (.*) - 任意の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)/ 
関連する問題