【问题标题】:Eclipse Regex Search and Replace Swap placesEclipse Regex 搜索和替换交换位置
【发布时间】:2015-12-28 04:56:15
【问题描述】:

我的课堂上到处都是这样的代码:

if (src.getTYPERECORD().getACT().equalsIgnoreCase("B"))

现在,如果 getter 返回 null,它可能会崩溃,为了团队的最佳实践,我被要求将其转换为:

if ("B".equalsIgnoreCase(src.getTYPERECORD().getACT()))

我想出了以下正则表达式来搜索更简单的情况,即我已经将值分配给了诸如 act.equalsIgnoreCase("B") 之类的变量:

(\w*).equalsIgnoreCase\("(\w*)"\)

替换为:

"\2".equalsIgnoreCase(\1)

除了上面提到的情况外,还有这个:

tos.substring(1,1).equalsIgnoreCase("A")

您能帮忙想出搜索和替换正则表达式来捕捉上面提到的两个例子吗? 它需要考虑开始 IF 括号相邻的情况,以及存在类似 if ( src.... 或 if (src....

谢谢!

【问题讨论】:

  • "something".equals(something) 可能会隐藏错误。我讨厌这种方法,我更喜欢单独处理null
  • 嵌套的可能性表明这个任务不应该用正则表达式来完成,而应该用解析器来完成。
  • @Pshemo - 解析器是什么意思?你能给我推荐一个合适的吗?或者你建议我怎么做?
  • @MarounMaroun - 我也不喜欢这种方法,但这是团队负责人所要求的,以及其余代码的编写方式,不可协商,他们称之为“最佳实践”呵呵
  • 如果你想找到像foo.bar().baz.equals("someString")这样的部分,那么我们可以在这里尝试正则表达式(例如,因为"abc"+"bar""abc\"def"这样的字符串,这并不容易,但它可能是可能的正则表达式)。但是,如果您的代码将在 (..) 中包含嵌套表达式(如 foo.bar(someExpression(otherExpression())).baz.equals("someString")),问题就开始了,因为 Java 不允许在正则表达式引擎中进行递归,而 Eclipse 是用 Java 编写的。

标签: java regex eclipse replace


【解决方案1】:

像这样改变应该可以工作:

\b([\S]*?).equalsIgnoreCase\("(\w*)"\)

看看例子here at rubular

【讨论】:

  • 它不正确匹配,试试你的建议:rubular.com/r/PZqKDdRi17(示例不包括我后来才发现的子字符串大小写)
  • @Carmageddon 看看更新后的答案,感谢您向我指出 rubular(它是很棒的在线工具)!
  • 非常感谢!这很好用,除了这种情况: tos.substring(3, 3).equalsIgnoreCase("R") 但我会手动处理它,它很少见。很高兴听到您也从中发现了一些有用的东西:)
  • 有趣的是,它不匹配这个:src.getTYPERECORD().getNC().equalsIgnoreCase("TX--")
  • @Carmageddon 最后一个例子只是因为 \w 不包括破折号,所以像这样改变: \b([\S]*?).equalsIgnoreCase("([\w -]*)") ,而前一个只是因为你在参数中有一个空格,删除空格,它会起作用....
【解决方案2】:

Java 8 的 Optional 来救援!

if (Optional.ofNullable(src).map(Source::getTYPERECORD)
    .map(TypeRecord::getACT).orElse("").equalsIgnoreCase("B"))

如果链上的任何内容为空,包括src 本身,orElse() 就会触发并且测试将是错误的。否则,测试将按预期进行。

【讨论】:

  • 我很感激希望提供帮助并就所提出的问题提供替代建议,但有原因.. 该项目适用于 Java 1.6,我无法更改,我无法让他们更改标准 - 我清楚地说明了这一点,并且我需要替换我自己的表达方式......所以请给出问题的解决方案,而不是提出我无法使用的解决方案。
  • @Carmageddon 好的。但你有我的同情。 Java 1.6 即将迎来其 10 岁生日。这真的落后...
【解决方案3】:

这样就可以了:

Search: if\s*\(\s*(src.*)\.equalsIgnoreCase\((.*?)\)
Replace: if (\2.equalsIgnoreCase(\1)

在 Eclipse 中测试。

【讨论】:

    猜你喜欢
    • 2016-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多