我有这个字符串
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
答案 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)?","");