[英]Find and replace whole line based on regex java
我有這串
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(\\.*)","");
但它無法檢測到線路。 經過測試的罪魁禍首必須是。*部分,但我不知道如何將其放入字符串中。
replace
不使用正則表達式語法, replaceAll
使用。 這意味着\\\\.*
只需替換代表\\
文本.
和*
。
因此,您的第一個解決方案可能看起來像這樣(注意,要在正則表達式中創建\\
文字,您需要對其進行兩次轉義:一次在regex \\\\
,一次在字符串文字"\\\\\\\\"
)
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 8中
String v = u.replaceAll("(?m)^\\s*\\}d \\\\ql.*\\R?","");
Java 8之前的版本
String v = u.replaceAll("(?m)^\\s*\\}d \\\\ql.*(\r?\n|\r)?","");
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.