2011-11-25 52 views
0

這是用來查找塊註釋的正則表達式和它的作品精美絕倫查找和替換塊中使用Java正則表達式模式評論

/\\*(?>(?:(?>[^*]+)|\\*(?!/))*)\\*/ 

我只需要修改它一點點。在塊註釋中查找「可能」存在的分號(;),並用空格替換它。

目前我做這個

while (m.find()) { 
    if (m.group().contains(";")) { 
     replacement = m.group().replaceAll(";", ""); 
     m.appendReplacement(sb, replacement); 
    } 
} 
m.appendTail(sb); 

但我需要一個str.replaceAll一種說法來取代它。總之,任何效率更高的東西,因爲我的內存異常。我修復了一些用來拋出相同異常的正則表達式,它們工作正常。我希望這個正則表達式也可以被優化。

---編輯---

這些都是你可以測試

/* this* is a ;*comment ; */ 

/* This ; is* 
another 
;*block 
comment; 
;*/ 

由於此正則表達式的字符串

+0

我可能會寫你的正則表達式,如果你可以張貼一個例子短語,然後突出顯示你從它想要的東西。 – Mikhail

+0

給出堆棧跟蹤。 – itun

+0

@Misha請查看編輯後的問題。我提供了一個樣本字符串。謝謝 – Ali

回答

0

有兩種變體(都試一下):

1)。你爲什麼用?>?我不知道它是什麼意思,我不認爲有必要在這裏使用像?>這樣的特殊東西。將其更改爲?:。 2)。你的循環是無限的。 你需要這樣的:

int index = 0; 
    while (m.find(index)) { 
     if (m.group().contains(";")) { 
      replacement = m.group().replaceAll(";", ""); 
      m.appendReplacement(sb, replacement); 
     } 
     index = m.end(); 
    } 
+1

'(?> ...)'是一個[原子團體](http://www.regular-expressions.info/atomic.html),它是最大效率所必需的[[所有格量詞](http:///www.regular-expressions.info/possessive.html)也可以工作)。這不是一個無限循環; find()方法自身跟蹤匹配開始位置。 'find(int)'用於特殊情況。 –

3

It'l太大傻笑使用正則表達式(?s)/\*.+?\*/。在你的表情中,你使用了「吃」你的記憶的負面看法。 您的代碼可以更簡單:

while (m.find()) { 
    m.appendReplacement(sb, m.group().replace(";",""); 
} 
m.appendTail(sb); 
+0

+1用於清除混亂(特別是'm.group()。contains(「;」)'調用),但是他的正則表達式針對效率進行了優化,所以我不會改變它。這不是我怎麼寫的,但它應該比'/\*.+?\*/'好得多。 –

+0

我不確定更好的效率。 Lookahead可以調用記憶問題,尤其是在入口處有大量文字時。原子團體根本無法解決這個問題。 –

+0

這只是展望一個角色,它只會在它看到一個星號之後。在性能方面,前視並不會造成重疊和量化效果重疊的問題。原子團隊就是這樣。 –