正则表达式检索不包含字符串的字符串的一部分

时间:2017-07-25 13:48:23

标签: java regex eclipse

我有一些字符串如下:

it.mycompany.db.beans.str1.PD_T_CLASS
it.mycompany.db.beans.join.PD_T_CLASS
it.mycompany.db.beans.str2.PD_T_CLASS_1
it.mycompany.db.beans.join.PD_T_CLASS_1
PD_T_CLASS myVar = new PD_T_CLASS();
myVar.setPD_T_CLASS(something);

我想选择“PD_”部分用“”替换它(空字符串)但只有整行不包含字符串“.join。”

我想要实现的目标是:

it.mycompany.db.beans.str1.T_CLASS
it.mycompany.db.beans.join.PD_T_CLASS
it.mycompany.db.beans.str2.T_CLASS_1
it.mycompany.db.beans.join.PD_T_CLASS_1
T_CLASS myVar = new T_CLASS();
myVar.setT_CLASS(something);

替换不是问题,因为我使用的是eclipse搜索工具,只要它显示正确的结果就会点击替换。

我试过了:

^((?!\.join\.).)*(PD_)*$ // whole string selected 
^((?!\.join\.).)*(\bPD_\b)*$ // whole string selected 

我开始感到沮丧,因为我搜索了一下(^((?!join bla bla来自那些搜索)

你能帮助我吗?

1 个答案:

答案 0 :(得分:3)

您可以使用以下正则表达式:

(?m)(?:\G(?!\A)|^(?!.*\.join\.))(.*?)PD_

并替换为

$1

请参阅regex demo

<强>详情:

  • (?m) - 一个Pattern.MULTILINE内联修饰符标志,用于强制^匹配行的开头而不是整个字符串
  • (?:\G(?!\A)|^(?!.*\.join\.)) - 两种选择中的任何一种:
    • \G(?!\A) - 上一次成功比赛的结束
    • | - 或
    • ^(?!.*\.join\.) - 在其中没有.join.文字的行的开头(因为(?!.*\.join\.)是一个否定前瞻,如果匹配任何0 +以外的字符,则匹配将失败换行符(.*)然后.join.
  • (.*?) - 捕获组#1(在替换模式中引用$1反向引用):除了换行符之外的任何0+字符,尽可能少,直到第一次出现...
  • PD_ - 文字PD_

替换是第一个捕获组的$1反向引用,它将恢复PD_之前匹配的任何文本。