2016-04-17 123 views
2

我有這個字符串查找和替換全線

Chest pain\tab \tab 72%\tab 0%\tab 67% 
}d \ql \li0\ri0\nowidctlpar\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\tx9360\tx10080\tx10800\tx11520\tx12240\tx12960\faauto\rin0\lin0\itap0 {\insrsid14762702 
}d \ql \li0\ri0\nowidctlpar\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\tx9360\tx10080\faauto\rin0\lin0\itap0 {\b\f1\fs24\ul\insrsid14762702 Waveform}{\insrsid14762702 
}{\insrsid14762702 {\*\shppict{\pict{\*\picprop\shplid1025{\sp{\sn shapeType}{\sv 75}}{\sp{\sn fFlipH}{\sv 0}}{\sp{\sn fFlipV}{\sv 0}}{\sp{\sn fLine}{\sv 0}}{\sp{\sn fLayoutInCell}{\sv 1}}} 
\ 

我想要得到與}d \ql在他們擺脫了所有的行

我已經試過

String v= u.replace("}d \\ql(\\.*)",""); 

但它不檢測線路。已經測試過它的罪魁禍首必須是。*部分,但我不知道如何將其放入字符串。替換

+0

難道他們開始} d \\ QL或者是它在任何地方在線? – Alex

+0

爲什麼在'。*'之前有反斜槓?如果你嘗試'String v = u.replace(「} d \\ ql。*」,「」);'? –

+0

}標記B-之前通常有一個空格,我沒有嘗試過。 –

回答

4

replace不使用正則表達式語法,replaceAll。這意味着\\.*只是取代代表\.*的文字。

所以,你的第一個解決方案可能看起來像(請注意,創建\在正則表達式的文字,你需要逃脫它兩次:一次是在正則表達式\\,一次在字符串字面"\\\\")這裏

String v = u.replaceAll("\\}d \\\\ql.*",""); 

但可能出現的問題是我們並不要求\}被放置在字符串的開頭。此外,我們正在跳過在\}之前存在的該領域的領先空間。
爲了解決這個問題,我們可以在你的正則表達式開始處添加^\s*,並且使^代表行的開始(我們可以用MULTILINE標誌來做 - 我們可以使用(?m))。

所以,現在我們的解決方案可能看起來像:

String v= u.replaceAll("(?m)^\\s*\\}d \\\\ql.*",""); 

但還有另一個問題。 .無法匹配行分隔符,因此.*不會將它們包含在匹配中,這會阻止我們刪除它們。因此我們應該明確地將它們包含在我們的匹配中(我們也應該使它們成爲可選項 - 我們可以使用?量化符 - 如果要匹配的行將是最後一個,這意味着它後面不會有行分隔符) 。從Java 8開始,我們可以使用\R,它可以匹配幾行分隔符(包括段落分隔符),或者如果只想限制\r\n(或不能使用Java 8),可以使用類似(\r?\n|\r)的東西。

所以我們最後解決方案可以是這樣的:

在Java中
String v = u.replaceAll("(?m)^\\s*\\}d \\\\ql.*\\R?",""); 

前的Java 8

String v = u.replaceAll("(?m)^\\s*\\}d \\\\ql.*(\r?\n|\r)?",""); 
+0

最後'\ R' /'[\ r \ n]'可以用'*'更好地量化。 –

+0

@WiktorStribiżew我雖然關於它,但我不知道如果OP也想刪除以下空行,所以我沒有添加任何重複行分隔符。 – Pshemo

+0

然後,爲了不刪除空行,'?'更好。在這種情況下可能不需要,但一般來說是個好主意。 –