2017-08-01 14 views
1

私は、次のコードをしようとしている、しかし、他の言語のために働くが、ない錆Rustの逆参照を使ってRegexを使って正規表現文字列置換を行うにはどうしたらいいですか?

#[test] 
fn regex_test() { 
    let regex = Regex::new(r"(\*|_)(.*?)\1").unwrap(); 
    let string = "*quack* klfjalksd *this* is a *test* **dfadfjkl** "; 
    let substitution = "<em>$2</em>"; 

    // result will be a String with the substituted value 
    let result = regex.replace_all(string, substitution); 

    println!("{}", result); 

} 

のために結果が置換のどれも持っていません:

*quack* klfjalksd *this* is a *test* **dfadfjkl** 

答えて

4

regex crate documentationからの:

このクレートは、正規表現の解析、コンパイル、および実行のためのライブラリを提供します。その構文はPerl形式の正規表現に似ていますが、には、ルックアラウンドや後方参照のようないくつかの機能がありません。代わりに、すべての検索は、正規表現と検索テキストのサイズに対して線形時間で実行されます。

あなたの正規表現は、逆参照を使用します。 Rustで後方参照を使用する場合は、fancy-regexまたはPCREやOnigurumaなどの別の正規表現エンジンにバインドする他のクレートをお勧めします。

この場合(regex 0.2.xの場合)、\1は、UnicodeコードポイントU+0001に対応する8進エスケープとして解釈されます。

+0

これまで私はfancy-regexとonigを試してきましたが、どちらもこれを行うことはできませんし、置換の構文が文書化されていない場合もあります。 – thouliha

+0

自分で代入を実装する必要があるかもしれませんが、両方とも逆参照をサポートしています。これは、あなたが打つ根本的な問題です。 – BurntSushi5

関連する問題