2016-03-25 29 views
1

ソース文字列の先頭に正確に一致する部分文字列が1つあります。文字列の先頭に正確な部分文字列を一致させる正規表現

source_string = "This is mat. This is cat." 

substring1 = "This is" 

substring2 = "That is" 

source_string.match(/^(#{substring1}|#{substring2})$/) 

これは、私が正確な「This is」または「That is」は、それが一致している必要があり、文字列の先頭に存在する場合、それは、次のように動作するはずしようとしたものですsource_stringでそれらの部分文字列の後に存在しているかは重要ではありません。 'This is'が存在する場合でも、私のコードはnilです。

答えて

2

正規表現パターンの末尾にある$を削除します。 $を付加することにより

source_string.match(/^(#{substring1}|#{substring2})$/) 
                ↑ 

、それはパターンがThis is又はThat isで終わる必要とします。あなたは最初に^が必要です。


source_string = "This is mat. This is cat." 
substring1 = "This is" 
substring2 = "That is" 
source_string.match(/^(#{substring1}|#{substring2})/) 
# => #<MatchData "This is" 1:"This is"> 
+0

私は$の使用を知っていない大丈夫ありがとうございます。 –

1

@falsetruは、コアの問題についての権利ですが、正規表現は、まだ実際に間違っています。目標は、元の文字列の先頭にパターンに一致するようにであるが、ない各行の冒頭に、\A修飾子(詳細はRegexp::Anchorsを参照)を使用する必要があります。

source_string = <<-STR 
Not to be matched. 
This is cat. 
STR 
source_string.match(/^This is/) # this should not be matched! 
#⇒ #<MatchData "This is"> 
source_string.match(/\AThis is/) 
#⇒ nil 
3

私はいないだろう正規表現を使用してください:

[substring1, substring2].any? { |sub| source_string.start_with?(sub) } 
    #=> true 
+1

ええ、それ。私は個人的に非常に正規表現を愛し、私のコードはそれに苦しんでいる:) – mudasobwa