我是新的正則表達式,你能幫我解決這個問題嗎?Javascript正則表達式難以取代
我想更換
一些文字和XXblaaaaa#和文本再次XXbl!阿夫拉#或XXblalala#或XXbabla#
與
一些文字和OOTEXT * *和文本再次OOTEXT **或OOTEXT **
我的測試正則表達式是:/((XX).+?(?=(#)))/g;
,即找到XX
直到#
。
但我怎麼可以設置以下條件:直到#
如果XX
和#
之間串不包含!
?
我是新的正則表達式,你能幫我解決這個問題嗎?Javascript正則表達式難以取代
我想更換
一些文字和XXblaaaaa#和文本再次XXbl!阿夫拉#或XXblalala#或XXbabla#
與
一些文字和OOTEXT * *和文本再次OOTEXT **或OOTEXT **
我的測試正則表達式是:/((XX).+?(?=(#)))/g;
,即找到XX
直到#
。
但我怎麼可以設置以下條件:直到#
如果XX
和#
之間串不包含!
?
您可以使用.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**"
我不知道,如果你的例子是真的就這麼簡單,所以上面是一個很大的靈活性的方法。你也可以使用[^!]*?
來代替.*?
,但任何更復雜的單個角色都需要更加精細。
它確實具有超前性。 –
@ m.buettner:的確,我認爲當時是在考慮後視。有一個有,一個沒有,但永遠不會記得。 ;-) –
是的,令人費解。它不具有向後看,但它確實具有向前看。 –
/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
爲什麼不把'#'放在字符類裏面去擺脫這種不正當性呢? –
我認爲這種方式更容易理解,因爲它看起來更像OP的描述。 「從XX到#不包括'!'」 – ColBeseder
當然,但這並不意味着我們不應該提倡最佳實踐;)。 –
我想你想要的是這樣的:
result = input.replace(/XX[^!#]*(?:![^#]*#[^!#]*)*#/g, "OOTEXT**");
它是如何工作的?我們匹配XX
,然後我們儘可能多地使用非!
,非#
字符。下一個組(?:![^#]#[^!#]*)
匹配!
,然後消耗一切,直到下一個#
並繼續與非#
非!
一樣。根據需要重複該部分多次,直到我們發現#
之前沒有!
。
爲什麼'XXbl!abla#或'從字符串中消失了? –
啊,現在我明白了。對於每個'!',你想忽略下一個'#',而不是跳過整個'XX ..!#'的東西。 –
對不起,一個開放的新問題http:// stackoverflow。com/questions/18382328/regex-to-detect-urls-with-character-end-ended – Dmitry