2011-12-30 1 views
2

Ocamlで正規表現を使用して完全一致を見つける方法は?正規表現を使用してOcamlの正確な文字列に一致する

let contains s1 s2 = 
let re = Str.regexp_string s2 
in 
try ignore (Str.search_forward re s1 0); true 
with Not_found -> false 

s2は「_X_1」で、s1は、「A_1_X_1」、「A_1_X_2」のような文字列を供給....ので、関数への上に「含む」:例えば、私はこのようなコードを持っています。目的は、s1が「A_1_X_1」のときに完全一致を見つけることです。しかし、現在のコードでは、s1が "A_1_X_10"、 "A_1_X_11"、 "A_1_X_100"などであっても一致します。

"_X_1"、 "[_X_1] $"は "_X_1"ではなく[動作していないようです。誰かが間違っていることを示唆することはできますか?

+1

、通訳なしメタキャラクター –

+0

はい、あなたは正しいです。 "A_1_X_1"も含まれています。 "_X_1 $"が偽を返します。 –

+0

はい、私は "_X_1"を渡すとStr.regexp_stringが^ _X_1 $を返すことを期待していました。したがって、私のコードはそのように書かれました。しかし、Str.regexp_stringは何か他のことをしています... –

答えて

3

あなたは、行の末尾に一致するように$メタ文字を使用することができます(これは文字列が複数の行を含んでいないと仮定した場合、文字列の終わりです)。しかし、あなたはそれをStr.regexp_stringに置くことはできません。メタキャラクターをエスケープするだけです。あなたは、まず、実際の部分文字列の部分を引用して、$を追加して、そこから正規表現を作成する必要があります。

文字通り渡された文字列にマッチする正規表現を生成しますが、 `Str.regexp_string`を使用
let endswith s1 s2 = 
    let re = Str.regexp (Str.quote s2^"$") 
    in 
    try ignore (Str.search_forward re s1 0); true 
    with Not_found -> false 
+0

はい、そうです。私はregexp_stringを使って間違いを犯しました。私は正規表現を使用すべきだった。入力いただきありがとうございます! –

0

正規表現は入力のどこでも一致しますので、表示される動作は正常です。

正規表現をアンカーする必要があります。^_X_1$

また、[_x_1]は助けにはなりません:[...]あなたがx1または_ある文字にマッチする正規表現エンジンを尋ねるここで、文字クラスです。

+0

と^ _X_1 $は一致しません_X_1。 _X_1もfalseを返します –

+0

Eh?どのような正規表現のエンジンですか? – fge

+0

私はOcamlを新しくしており、それについてはあまり知らない。しかし、私の最初の勘違いは、正規表現への変換自体が何か変なことをしていることです。 (Str.regexp_string) –

2

Str.match_endは何が必要です:

この定義に
let ends_with patt str = 
    let open Str in 
    let re = regexp_string patt in 
    try 
    let len = String.length str in 
    ignore (search_backward re str len); 
    match_end() == len 
    with Not_found -> false 

、機能はあなたが必要として動作します。

# ends_with "_X_1" "A_1_X_10";; 
- : bool = false 
# ends_with "_X_1" "A_1_X_1";; 
- : bool = true 
# ends_with "_X_1" "_X_1";; 
- : bool = true 
# ends_with "_X_1" "";; 
- : bool = false 
+0

Matiasに感謝します! –

関連する問題