2013-03-28 53 views
9

我想換成由-圍成~封閉弦弦全封閉不要更換正則表達式,但如果此字符串再由*封閉。如果它是由一個字符

作爲一個例子,這個字符串...

The -quick- *brown -f-ox* jumps. 

...應該成爲...

The ~quick~ *brown -f-ox* jumps. 

我們看到-如果是*<here>*僅更換。

我的JavaScript正則表達式現在(它沒有任何照顧,無論是通過*封閉與否):

var message = source.replace(/-(.[^-]+?)-/g, "~$1~"); 

編輯:請注意,這可能是有奇數個* S上的情況下, 。

+7

爲什麼downvote? – poitroae

+0

是我很驚訝,這個問題很好。 – Jai

+2

什麼時候有奇數個*字符?例如。 '* - 快速* *棕色* -f-ox *跳躍* .'應該替換哪個'-'字符,爲什麼? –

回答

2

這對於正則表達式來說是一個棘手的問題。我想我會做的是這樣的:

var msg = source.replace(/(-[^-]+-|\*[^*]+\*)/g, function(_, grp) { 
    return grp[0] === '-' ? grp.replace(/^-(.*)-$/, "~$1~") : grp; 
}); 

jsFiddle Demo

,以查找要麼-*組,只執行對那些虛的更換。通常,「嵌套」語法對於正則表達式來說是具有挑戰性(或不可能)的。 (當然關於這一問題的筆記註釋的,也有特殊情況—懸掛元字符—太複雜這一點。)

+1

工作示例:http://jsfiddle.net/Zb6BU/ - 不知道爲什麼這不起來票,這工作正如預期! +1 –

+0

@mcpDESIGNS:其他答案也在工作:-) – Bergi

+0

@Bergi我看到現在,+ 1的所有:)哈哈 –

1

我會通過拆分基於*數組,然後只更換偶數索引解決它。匹配不平衡的明星是棘手的,它涉及到了解的最後一項指標是奇數還是偶數:

'The -quick- *brown -f-ox* jumps.' 
    .split('*') 
    .map(function(item, index, arr) { 
     if (index % 2) { 
      if (index < arr.length - 1) { 
       return item; // balanced 
      } 
      // not balanced 
      item = '*' + item; 
     } 
     return item.replace(/\-([^-]+)\-/, '~$1~'); 
    }) 
    .join(''); 

Demo

+0

如果字符串包含不是一對的一部分的'*'會怎麼樣?例如'''-quick- * brown -f-ox跳轉'。'如果我理解正確,在這種情況下,'-quick-'和'-f-'應該被替換,但是隻有'-quick-'會被替換。 –

+0

@KenB它會假設星星平衡:) –

+0

根據上下文,這是一個很大的假設。 –

1

找出匹配是否是一些分隔符封閉是一個非常複雜的任務 - 另請參閱this exampleLookaround可以提供幫助,但JS只支持lookahead。因此,我們可以把「~包圍」到「後面是偶數~」,並搭配上:

source.replace(/-([^-]+)-(?=[^~]*([^~]*~[^~]*~)*$)/g, "~$1~"); 

不過還好,我們同時匹配-*,讓我們消耗任何東西裹在* S以及然後可以在回調函數決定不更換:

source.replace(/-([^-]+)-|\*([^*]+)\*/g, function(m, hyp) { 
    if (hyp) // the first group has matched 
     return "~"+hyp+"~"; 
    // else let the match be unchanged: 
    return m; 
}); 

這具有能夠更好地指定的優勢「封閉的」,例如,通過在「內部」添加字邊界,以更好地處理無效模式(例如@馬拉斯提到的奇數*字符) - 當前正則表達式只需要接下來的兩次出現。

0

傑克非常清晰的答案的一個特殊版本。

source.split(/(\*[^*]*\*)/g).map(function(x,i){ 
return i%2?x:x.replace(/-/g,'~'); 
}).join(''); 

似乎工作, 乾杯。

相關問題