2016-11-22 24 views
-1

輸入的字符串:#This is a header\nSome line\nAnother lineJava的正則表達式來把不以#開頭的內部<p></p>標籤

所需的輸出:

#This is a header 

<p>Some Line</p> 

<p>Another line</p> 

我已經試過這樣:

s = s.replaceAll("(^|\\n)*(?!#)([^\\n]+)(\\n|$)", "$1<p>$2</p>$3"); 

但它不會正常工作。 所以我很感激你的幫助。

+0

嘗試'.replaceAll( 「(M +)^(#。* \ R'\ n)的(。*)(\ R'\ n)的(。*)」,「$ 1

$ 2

$ 3

$ 4

「)' –

+0

謝謝,它的工作原理!請你能解釋一下嗎? –

+0

它匹配以'#'開頭的任何行,然後將該行下面的2行捕獲到單獨的組中。然後,標籤被添加到替換模式中。我只是不明白,你顯示的字符串是長文本的一部分還是以某種固定格式? –

回答

0
a.replaceAll("(?m)^(#[^\r\n]+)\r?\n([^\r\n]+)\r?\n([^\r\n]+)$", "<p>$1</p><p>$2</p><p>$3</p>") 

正則表達式:(?m)^(#[^\r\n]+)\r?\n([^\r\n]+)\r?\n([^\r\n]+)$

  • (?m)添加multine標誌。這意味着^$字符的行爲不同。
  • ^開始任何線的
  • (#[^\n\r]+) 1組:字面# 1個或多個非新行和非回車字符
  • \r?\n可選回車字符,換行符和非回車字符
  • ([^\n]+)組2:1或更大的非換行和非回車字符
  • \r?\n可選回車字符,換行符和非回車字符
  • ([^\n]+)組3:1或更多個非換行和非回車字符
  • $端任何線

代用品的:<p>$1</p><p>$2</p><p>$3</p>

$n將插入該組數。因此$1將成爲「#這是一個標題」。

+0

僅供參考,如果換行符是CRLF格式,這可能不是最好的解決方案。 –

+0

我確實考慮過這一點,但原來的帖子似乎打了折扣。我現在也調整了處理'\ r'。 – Whothehellisthat

+0

是的,但現在,它匹配字符串中任何位置的'#',即使在一行的中間。 –

相關問題