【问题标题】:regular expression retrieve a portion of a string that not contain a string正则表达式检索不包含字符串的字符串部分
【发布时间】:2017-07-25 13:48:22
【问题描述】:

我有一些字符串,如下所示:

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 来自这些搜索)

你能帮帮我吗?

【问题讨论】:

  • 试试^(?!.*\.join\.)(.*)PD_ => $1。我知道一行中只有 1 个 PD_ 需要删除?
  • 不...它再次选择整行:(
  • 是的,但是替换为$1
  • 1) PD_ 可以在一行中多次出现,因为它是一个代码行,而 PD_something 是一个类,并且肯定有 PD_a_field 并且它们很多 2) 如果 eclipse 搜索工具可以使用 $1 进行替换...我不是在编写代码...我正在用 void 字符串替换部分代码(用于数据库表名更改)

标签: java regex eclipse


【解决方案1】:

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

(?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_s 之前匹配的任何文本。

【讨论】:

    猜你喜欢
    • 2011-07-22
    • 1970-01-01
    • 2016-04-21
    • 1970-01-01
    • 2016-03-05
    • 2011-06-27
    • 2012-05-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多