簡體   English   中英

查找和替換基於正則表達式Java的整行

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM