2011-10-31 69 views
15

快速的問題:我的模式是一個SVG字符串,它看起來像l 5 0 l 0 10 l -5 0 l 0 -10要做到對一個參考,我需要拋棄所有,但第一l我知道我的一些單元測試對比可以將它們全部棄置並預先放置'l',或者我可以使用子字符串。但我想知道是否有這樣的JavaScript正則表達式成語?如何更換所有,但在字符串的模式的第一次出現

+0

第一個l總是在字符串的開頭嗎? –

+0

我知道你說你不想要這個,但是到第一個空間的子串似乎是最容易閱讀和維護的。 – Randy

+0

@標記爲這個用例,它甚至是'l',但是這也適用於負向預測。 –

回答

24

你可以嘗試負先行,避免了字符串的開頭:

/(?!^)l/g 

看看在線:jsfiddle

+0

是的,這似乎工作謝謝! –

+0

我試圖修改這個工作的第一個' - '字符出現,我有一個非常困難的時間:(任何幫助表示讚賞。在此先感謝。 –

+0

我該如何使用它一個變量? – Wlliam

-1

像這樣的事情?

"l 5 0 l 0 10 l -5 0 l 0 -10".replace(/[^^]l/g, '')

+3

雖然這在這種情況下起作用,但是'^'不代表字符類中的文字字符嗎? – pimvdb

+2

'[^^]'匹配除'^'之外的任何字符。 (!/ [^^] /。test('^')&& /[^^]/.test('x'))=== true' –

7

有沒有JS正則表達式來代替一切,但最的第一圖案匹配。但是,您可以通過將函數作爲第二個參數傳遞給replace方法來實現此行爲。

var regexp = /(foo bar)(red)/g; //Example 
var string = "somethingfoo bar red foo bar red red pink foo bar red red"; 
var first = true; 

//The arguments of the function are similar to $0 $1 $2 $3 etc 
var fn_replaceBy = function(match, group1, group2){ //group in accordance with RE 
    if (first) { 
     first = false; 
     return match; 
    } 
    // Else, deal with RegExp, for example: 
    return group1 + group2.toUpperCase(); 
} 
string = string.replace(regexp, fn_replaceBy); 
//equals string = "something foo bar red foo bar RED red pink foo bar RED red" 

函數(fn_replaceBy)針對每個匹配執行。在第一次匹配時,函數立即返回匹配的字符串(沒有任何反應),並設置一個標誌。
每個其他比賽將根據功能中描述的邏輯進行替換:通常,您使用$0 $1 $2等等來回引用組。在fn_replaceBy中,函數參數等於這些:第一個參數= $0,第二個參數= $1等等。

匹配的子字符串將被函數fn_replaceBy的返回值替換。使用函數作爲replace的第二個參數允許非常強大的應用,例如intelligent HTML parser

參見:MDN: String.replace > Specifying a function as a parameter

+0

我不相信「智能HTML解析器」不會鏈接到「使用正則表達式解析HTML」的答案,哈哈。但非常好的答案,這正是我所需要的。 – henrebotha

2
"l 5 0 l 0 10 l -5 0 l 0 -10".replace(/^\s+/, '').replace(/\s+l/g, '') 

確保第一'l'不是由前面的空間,並刪除任何空格,然後由'l'

相關問題