2011-01-09 74 views
5

這就是會被一起工作的字符串的示例:正則表達式(正則表達式),更換第二occurence在JavaScript

xxxxxx[xxxxxx][7][xxxxxx][9][xxxxxx] 

我有一個小麻煩匹配匹配的第二次出現,我想要返回第二個方括號裏面的數字。我有一些正則表達式找到字符串中的數字的第一個方形背景:

\[+[0-9]+\] 

這返回[7],但是我想返回[9]。

(?:.*?(\[+[0-9]+\])){2} 

我使用JavaScript的替換功能,下面的正則表達式的第二次出現(在[9])中的正則表達式應用testeing,但它是不正確的替換的Javascript替換功能相匹配我的問題是我如何使用上述正則表達式替換Javasctipt中的[9],或者是否有另一個正則表達式與方括號中的第二個數字匹配。

乾杯!

回答

3

如果xxx只是任何字符串,而不一定是一個數字,那麼這可能是你想要什麼:

(\[[0-9]+\]\[.*?\])\[([0-9]+)\] 

這會在[]第二個數字。將其替換爲$1[<replacement>]Play with it on rubular

你的正則表達式未能按預期工作,因爲組隨後+最終只會抱着最後[xxx]

+0

爲什麼你使用`{3}`作爲量詞?這似乎並不是「在我們想要的那個之前總會有三個標籤,而在一個」之後的一個「標籤中,不應該將正則表達式基於提問者陳述的實際要求嗎?個人而言,我會使用`/(\ [\ d + \](?:\ [。*?\ D。*?\])*)(\ [\ d + \])/ \ 1 [replacement] /` – 2011-01-09 20:58:41

+0

@匿名我們不知道「xxx」不是一個數字。我以爲這是,但也許我錯了。 – marcog 2011-01-09 21:00:29

1

嘗試

result = subject.replace(/(\[\d\]\[[^\]]+\])\[\d\]/, "$1[replace]"); 

作爲評價正則表達式:

(  # capture the following in backref 1: 
\[\d\] # first occurrence of [digit] 
\[  # [ 
[^\]]+ # any sequence of characters except ] 
\]  # ] 
)  # end of capturing group 
\[\d\] # match the second occurence of [digit] 

如果[xxx]組的第一和第二[digit]組之間的數量是可變的,然後使用

result = subject.replace(/(\[\d\](?:\[[^\]]+\])*?)\[\d\]/, "$1[replace]"); 

通過圍繞與匹配的部分組與(非捕獲)括號和惰性量詞*?我要求正則表達式引擎儘可能少地匹配這些組,但是儘可能多地匹配,因此下一個組是[digit]組。

0
console.log("xxxxxx[xxxxxx][7][xxxxxx][9][xxxxxx]".replace(
/^(.*\[[0-9]+\].*)(\[[0-9]+\])(.*)$/, 
'$1[15]$3')); // replace with matches before ($1) and after ($3) your match ($2) 

回報:

// xxxxxx[xxxxxx][7][xxxxxx][15][xxxxxx] 

它將匹配其中[n]由1組具有內部數字括號preceeded。