簡體   English   中英

正則表達式替換所有不在引號中的令牌?

[英]regex to replace all tokens not in quotes?

我試圖在JavaScript中處理一些輸入數據,我需要用包裝原始令牌的字符串替換所有字符串標記(格式為“ID1”,“ID2”,“ID3”,...)的出現。 例如,“ID1”變為“table ['ID1']”。 但是,如果原始令牌包含在引號(單引號或雙引號)中,則必須將其忽略。

例如輸入字符串:

var input = "ID10 \"ID0\" FOO 'ID0' #ID0# ID10 BAR ID1 ID0.";

應成為:

"table['ID10'] \"ID0\" FOO 'ID0' #table['ID0']# table['ID10'] BAR table['ID1'] table['ID0']."

我現在可以使用以下代碼獲得一些方法( 在jsbin.com上試試 ):

var input = "ID10 \"ID0\" FOO 'ID0' #ID0# ID10 BAR ID1 ID0.";

var expected = "table['ID10'] \"ID0\" FOO 'ID0' #table['ID0']# table['ID10'] BAR table['ID1'] table['ID0'].";

// assume 15 is the max number of ids. we search backwards.
for( i=15 ; i>=0 ; i-- )
{
    var id = "ID" + i;

    var regex = new RegExp( "[^\"\']" + id + "", 'g' );

    input = input.replace( regex, "table['" + id + "']" );
}

if( input == expected )
    alert( 'success :)' );

這會產生輸出:

ID10 "ID0" FOO 'ID0' table['ID0']#table['ID10'] BARtable['ID1']table['ID0'].

它似乎接近工作,但第一個id(ID10)被忽略,匹配前的第一個字符丟失。

任何人都可以建議如何正確處理,謝謝。

我認為你需要一個負面的前瞻標記。

看看這里

整個正則表達式是

(ID\d+(?!\\))

負向前瞻是(?!...) 它只是斷言數字后面的下一個字符不是反斜杠

所以代碼就是這樣的

var re = /(ID\d+(?!\\))/g; 
var str = 'ID10 \"ID0\" FOO \'ID0\' #ID0# ID10 BAR ID1 ID0.';
var subst = 'table[\'$1\']'; 
var result = str.replace(re, subst);
// table['ID10'] \"ID0\" FOO 'table['ID0']' #table['ID0']# table['ID10'] BAR table['ID1'] table['ID0'].

您可以使用此正則表達式基於String#replace交替使用回調函數:

var input = "ID10 \"ID0\" FOO 'ID0' #ID0# ID10 BAR ID1 ID0.";
var r= input.replace(/"[^"]*"|'[^']*'|(ID\d+)/g, function($0, $1) {
       return ($1)? "table['"+$1+"']" : $0;});
//=> table['ID10'] "ID0" FOO 'ID0' #table['ID0']# table['ID10'] BAR table['ID1'] table['ID0'].

編輯似乎Javascript中不支持零寬度負面后視,因此在ID加數字不是反斜杠,單引號或雙引號之后,您需要零寬度負前瞻以檢查下一個字符。

你可以試試

/(ID\d+(?![\\\'\"]))/g

編輯忘了這一切!

你需要一個零寬度的負面觀察

你可以試試

 /(?<![\\"\\'])ID\\d+/g 

或者,您可以嘗試捕獲組中的匹配項

 /[^\\"\\'](ID\\d+)/g 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM