2013-08-22 67 views
1

我是新的正則表達式,你能幫我解決這個問題嗎?Javascript正則表達式難以取代

我想更換

一些文字和XXblaaaaa#和文本再次XXbl!阿夫拉#或XXblalala#或XXbabla#

一些文字和OOTEXT * *和文本再次OOTEXT **或OOTEXT **

I made a jsfiddle to test t.

我的測試正則表達式是:/((XX).+?(?=(#)))/g;,即找到XX直到#

但我怎麼可以設置以下條件:直到#如果XX#之間串不包含!

+0

爲什麼'XXbl!abla#或'從字符串中消失了? –

+0

啊,現在我明白了。對於每個'!',你想忽略下一個'#',而不是跳過整個'XX ..!#'的東西。 –

+0

對不起,一個開放的新問題http:// stackoverflow。com/questions/18382328/regex-to-detect-urls-with-character-end-ended – Dmitry

回答

0

您可以使用.replace(regex,function)過載:

var txt = 'Some text and XXblaaaaa# and text again XXbl!abla# or XXblalala# or XXbabla#'; 
var result = .replace(/(XX.*?#)/g,function(m,a){ 
    // only replace values that do not contain a '!' 
    return a.indexOf('!') == -1 ? 'OOTEXT**' : a; 
}); 
// "Some text and OOTEXT** and text again XXbl!abla# or OOTEXT** or OOTEXT**" 

我不知道,如果你的例子是真的就這麼簡單,所以上面是一個很大的靈活性的方法。你也可以使用[^!]*?來代替.*?,但任何更復雜的單個角色都需要更加精細。

+0

它確實具有超前性。 –

+0

@ m.buettner:的確,我認爲當時是在考慮後視。有一個有,一個沒有,但永遠不會記得。 ;-) –

+0

是的,令人費解。它不具有向後看,但它確實具有向前看。 –

1
/XX[^!]*?#/g 

這將取代從XX到#的所有內容,只要它不包括!

像這樣來使用:

"Some text and XXblaaaaa# and text again XXbl!abla# or XXblalala# or XXbabla#".replace(/XX[^!]*?#/g, "OOTEXT"); 

編輯:

更高效的版本是這樣的:

/XX[^!#]*#/g 

如果你不希望允許空格,然後加\s中的字符類別

/XX[^!#\s]*#/g 
+0

爲什麼不把'#'放在字符類裏面去擺脫這種不正當性呢? –

+1

我認爲這種方式更容易理解,因爲它看起來更像OP的描述。 「從XX到#不包括'!'」 – ColBeseder

+0

當然,但這並不意味着我們不應該提倡最佳實踐;)。 –

0

我想你想要的是這樣的:

result = input.replace(/XX[^!#]*(?:![^#]*#[^!#]*)*#/g, "OOTEXT**"); 

它是如何工作的?我們匹配XX,然後我們儘可能多地使用非!,非#字符。下一個組(?:![^#]#[^!#]*)匹配!,然後消耗一切,直到下一個#並繼續與非#!一樣。根據需要重複該部分多次,直到我們發現#之前沒有!