2013-07-26 5 views
33

私はに(正規表現で)値にを追加するとパターンは正常に動作しますが、JavaScriptに実装する際に問題があります。JavaScriptの正規表現として動的(可変)文字列を使用します

パターンは(valueは可変である)である:

/(?!(?:[^<]+>|[^>]+<\/a>))\b(value)\b/is 

私はバックスラッシュをエスケープ:

var str = $("#div").html(); 
var regex = "/(?!(?:[^<]+>|[^>]+<\\/a>))\\b(" + value + ")\\b/is"; 
$("#div").html(str.replace(regex, "<a href='#" + value +">" + value + "</a>")); 

しかし、これは権利ではないと思われる、私はパターンを記録し、そのまさにそれすべきだ。 アイデア

+0

'value'は可変ですか? – Dogbert

答えて

77

正規表現を文字列として作成するには、JavaScript's RegExp objectを使用する必要があります。

また、複数回一致/置換することもできます。その場合は、the g (global match) flagを追加してください。ここでは例です:一般的なケースでは

var stringToGoIntoTheRegex = "abc"; 
var regex = new RegExp("#" + stringToGoIntoTheRegex + "#", "g"); 
// at this point, the line above is the same as: var regex = /#abc#/g; 

var input = "Hello this is #abc# some #abc# stuff."; 
var output = input.replace(regex, "!!"); 
alert(output); // Hello this is !! some !! stuff. 

JSFiddle demo here.


、正規表現として使用する前に文字列をエスケープ:

すべての文字列は、しかし、有効な正規表現ではありません。 (または[のようないくつかの特殊文字があります。この問題を回避するには、正規表現に変換する前に文字列をエスケープしてください。予告there is no s (dotall) flag/modifier in JavaScript、問題の特定のケースでは

function escapeRegExp(stringToGoIntoTheRegex) { 
    return stringToGoIntoTheRegex.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'); 
} 

var stringToGoIntoTheRegex = escapeRegExp("abc"); // this is the only change from above 
var regex = new RegExp("#" + stringToGoIntoTheRegex + "#", "g"); 
// at this point, the line above is the same as: var regex = /#abc#/g; 

var input = "Hello this is #abc# some #abc# stuff."; 
var output = input.replace(regex, "!!"); 
alert(output); // Hello this is !! some !! stuff. 

JSFiddle demo here.


:そのためのユーティリティ関数は、以下のサンプルになります。それが利用可能な場合は、通常はドット(.)に改行を一致させます。ここにあなたのケースのための可能な解決策があります:私は"<a href='#" + value +"'>"の最後に行方不明'を追加

var str = $("#div").html(); 
var regexExpression ="(?!(?:[^<]+>|[^>]+<\\/a>))\\b(" + value + ")\\b"; 
var regex = new RegExp(regexExpression, "i"); 
$("#div").html(str.replace(regex, "<a href='#" + value +"'>" + value + "</a>")); 

注意してください。

See demo fiddle herethis solution using the "g" modifierもお試しください。

+0

ありがとうございました – Borstenhorst

+1

これは素晴らしいと私は今までのところ、正規表現で動的変数を使用して見つけた最高の例、ありがとう! – Eolis

2

あなただけのような正規表現を定義する"を必要としない:valueは可変であり、あなたは、あなたがこの表記を使用することはできません動的な正規表現をしたい場合は

var regex = /(?!(?:[^<]+>|[^>]+<\/a>))\b(value)\b/is; // this is valid syntax 

。代替表記法を使用してください。 valueは、(のような正規表現の文字が含まれてい[?場合は、エスケープする必要があることに注意してください

var regex = new RegExp("/(?!(?:[^<]+>|[^>]+<\/a>))\b(value)\b/", "is"); 
var regex = new RegExp("/(?!(?:[^<]+>|[^>]+<\/a>))\b(" + value + ")\b/", "is"); 
var regex = new RegExp("/(?!(?:[^<]+>|[^>]+<\/a>))\b(.*?)\b/", "is"); 

:あなたは"fox".replace("fox", "bear");

代替を行うことができますので、

String.replaceまた、入力として文字列を受け入れますそれら。

+1

最初のオプションは、文字列 "value"を検索しないと動作しません。 –

+0

@happytimeharry投稿した2つの正規表現の間に矛盾があるようです。 – Halcyon

+0

@Fritz van Campenパターンの意図は、彼のjavascriptの例では、変数を使用していたと思われる –

8

式で変数の値を使用する場合は、RegExp "コンストラクタ"を使用する必要があります。

var regex="(?!(?:[^<]+>|[^>]+<\/a>))\b(" + value + ")\b"; 
new RegExp(regex, "is") 
2

私はこのスレッドが役に立ちました - 私は自分自身の問題に答えを加えると思っていました。

javascriptのノードアプリケーションからデータベース構成ファイル(datastax cassandra)を編集し、ファイル内の設定のうち、文字列を照合してそれに続く行を置き換える必要があるとします。

これは私の解決策でした。

dse_cassandra_yaml='/etc/dse/cassandra/cassandra.yaml' 

// a) find the searchString and grab all text on the following line to it 
// b) replace all next line text with a newString supplied to function 
// note - leaves searchString text untouched 
function replaceStringNextLine(file, searchString, newString) { 
fs.readFile(file, 'utf-8', function(err, data){ 
if (err) throw err; 
    // need to use double escape '\\' when putting regex in strings ! 
    var re = "\\s+(\\-\\s(.*)?)(?:\\s|$)"; 
    var myRegExp = new RegExp(searchString + re, "g"); 
    var match = myRegExp.exec(data); 
    var replaceThis = match[1]; 
    var writeString = data.replace(replaceThis, newString); 
    fs.writeFile(file, writeString, 'utf-8', function (err) { 
    if (err) throw err; 
     console.log(file + ' updated'); 
    }); 
}); 
} 

searchString = "data_file_directories:" 
newString = "- /mnt/cassandra/data" 

replaceStringNextLine(dse_cassandra_yaml, searchString, newString); 

実行した後、それは新しいものに設定し、既存のデータディレクトリを変更します:

設定ファイルの前に:

data_file_directories: 
    - /var/lib/cassandra/data 

設定ファイルの後:

data_file_directories: 
- /mnt/cassandra/data 
関連する問題