根据正则表达式java查找并替换整行

时间:2016-04-17 15:07:19

标签: java regex

我有这个字符串

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(\\.*)","");

但它没有检测到该行。测试了它的罪魁祸首必须是。*部分,但我不知道如何把它放在string.replace

1 个答案:

答案 0 :(得分:4)

replace不使用正则表达式语法,replaceAll。这意味着\\.*只需替换代表\ .*的文字。

所以你的第一个解决方案可能看起来像(请注意,要在正则表达式中创建\字面值,您需要将其转义两次:一次在正则表达式\\中,一次在字符串文字中"\\\\")< / p>

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?","");

pre Java 8

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