在正则表达式中替换2个字符串中的字符串

时间:2014-06-17 20:35:59

标签: regex groovy

我有一个字符串:

dkj   a  *  &     &*(&(*(
//#HELLO
^%@&UJNWDUK()C*(v 8*J DK*9
//#HE#$^&&(akls#$98akdjl ak#@sjdkja
//
%^&*(//#HELLO//#BYE<><>
//#BYE
^%@&UJNWDUK()C*(v 8*J DK*90K )
//#HELLO
&*^J$XUK  8j8 j jk kk8(&*(
//#BYE

我需要有2个组,例如每个组必须以// HELLO开头,然后应该有下一行,任何类型的文本都可以跟随(。*),但它将以// BYE开头,后面跟一个行:

1)
//#HELLO
^%@&UJNWDUK()C*(v 8*J DK*9
//#HE#$^&&(akls#$98akdjl ak#@sjdkja
//
%^&*(//#HELLO//#BYE<><>
//#BYE

2)
//#HELLO
&*^J$XUK  8j8 j jk kk8(&*(
//#BYE

并将原始字符串替换为:(基本上将//添加到每个组的每一行)

dkj   a  *  &     &*(&(*(
////#HELLO
//^%@&UJNWDUK()C*(v 8*J DK*9
////#HE#$^&&(akls#$98akdjl ak#@sjdkja
////
//%^&*(//#HELLO//#BYE<><>
////#BYE
^%@&UJNWDUK()C*(v 8*J DK*90K )
////#HELLO
//&*^J$XUK  8j8 j jk kk8(&*(
////#BYE

这是我目前的进展: 我有

\/\/#HELLO\n.*?\/\/#BYE[\n$]

但是我不确定如何进行替换,我想在//#HELLO之后使用\ G分隔每组的每一行并以//#BYE结尾

2 个答案:

答案 0 :(得分:1)

要分组到单独的行,请使用以下正则表达式:

//#HELLO\r(.*[\n\r]+)*//#BYE\r?
  • \r - 换行符
  • [\n\r] - 输入字符
  • *? - 非贪婪的比赛
  • ? - 匹配1或0次

如果总是以换行符结尾,您可以在结尾处取出?

然后,您可以使用该组(括号内的值)进行搜索和替换。

答案 1 :(得分:1)

这有点复杂,但这样做会:

搜索:(?m)(//#HELLO[\r\n]+|\G(?://#BYE|(?=(?:[^#]|#(?!HELLO[\r\n]+))*#BYE)[^\r\n]*[\r\n]*))

替换://$1

在Groovy中:

String resultString = subjectString.replaceAll(/(?m)(\/\/#HELLO[\r\n]+|\G(?:\/\/#BYE|(?=(?:[^#]|#(?!HELLO[\r\n]+))*#BYE)[^\r\n]*[\r\n]*))/, '//$1');