【问题标题】:Java: do something if regex not foundJava:如果找不到正则表达式,请执行某些操作
【发布时间】:2018-07-09 02:43:45
【问题描述】:

我正在解析日志文件,并且需要在找到正则表达式时做一件事(将 ',TRUE' 添加到变量、.csv、ArrayList)和其他事情(添加一个空槽、“”或",_" 如果空槽不好),当找不到该正则表达式时。

可以从每个日志文件中解析 1-~200 个条目 - 因此正则表达式可以匹配多次。

我尝试了几个选项,要么在编译时出错(不喜欢针对字符串测试布尔值),要么没有发生可观察的操作,或者当找到正则表达式时,我得到了未找到正则表达式时的结果。

我需要一个变量,.csv 或 ArrayList 中的输出,所以如果找不到匹配项,那么我需要一个空的 ',' 因为输出是一个预定义的表,所以列需要正确对齐.

我尝试过的组合:

if(!noBaseText.equals("No matching base data found"))
if(!noBaseText.equals("No matching base data found") == false)
if(noBaseText.equals("No matching base data found" != true))
if(noBaseText.isEmpty())
if(noBaseText.equals(""))
if(!noBaseText.equals(""))
if(noBaseText.equals("No matching base data found"))

'} else {' 和 '} else if (...) {' 与上面的组合,无论是嵌套 if/else(如下面的代码)还是作为 'else' 到 'if (baseMatcher .find())' 返回相同的结果。

代码片段:

Pattern noBase = Pattern.compile("(?<noBase>No matching base data found)");
try(corrReader)
            {
                while ((corrLine = corrReader.readLine())!=null)
                {
                    corrText = corrLine.trim();
                    Matcher baseMatcher = noBase.matcher(corrText);
                    if (baseMatcher.find()) 
                    {
                        String noBaseText = baseMatcher.group("noBase");
                        if(!noBaseText.equals("No matching base data found"))
                        {
                            corrOutput += ",";
                        } else if(noBaseText.equals("No matching base data found")) {
                            corrOutput += ",TRUE";
                        } //end else
                    } //end if(baseMatcher)
                } //end while(corrLine)
            } //end try(corrReader)

匹配时得到的输出:

AA-123-12345-SP1.SSF,真,

没有匹配时我得到的输出:

AA-123-12345-SP2.SSF,100,100,guug04314054.zip,

没有匹配时我需要得到的输出:

AA-123-12345-SP2.SSF,,100,100,guug04314054.zip,

当正则表达式匹配,并返回',TRUE'时,不会有后面的条目;当正则表达式不匹配并返回“,”时,将会有额外的条目。

【问题讨论】:

  • find() 的结果还不够吗?为什么检查组?
  • 顺便说一句,如果find() 返回true,则该组将始终是该文本,因此您永远不会得到","。试试corrOutput += baseMatcher.find() ? "TRUE," : ",";if (baseMatcher.find()) { corrOutput += "TRUE,"; } else { corrOutput += ","; }
  • @Carlos Hueberger 输出是 .csv,因此该字段的列在不为真时会被保留,在导入电子表格时会丢弃列。
  • @Carlos Hueberger 我尝试了您的建议,但结果没有变化。谢谢你的帮助,寿!!
  • 只使用find()的结果; 不要使用 group(...)

标签: java regex


【解决方案1】:

我不确定我是否正确,但是..如果您想检查模式是否为空,请执行以下操作:

if(noBase.pattern().isEmpty()) {
// do your stuff
}

【讨论】:

  • pattern() 应该只返回构造函数中使用的正则表达式...
【解决方案2】:

您可以使用三元运算符来完成此操作:

boolean found = false;
while ((corrLine = corrReader.readLine())!=null)
{
  ...
      String noBaseText = baseMatcher.group("noBase");
      found |= noBaseText.equals("No matching base data found");
  ...
}

corrOutput += found ? "TRUE," :  ",";

如果found 的计算结果为真,您将获得"TRUE,",否则为","

【讨论】:

  • 我在添加第一个 sn-p 时得到相同的行为,但是当我将 else 添加到 baseMatcher 时,我在输出中得到很多虚假逗号 - 我的预感是由于 while 循环迭代25 个条目,其中只有 1 个应返回“TRUE”。
  • 啊,如果你想要一个聚合(TRUE, 如果在 25 条记录中的任何一条中找到,, 否则),那么你需要一个布尔变量来跟踪它是否在环形。您需要 |= 而不是在循环中追加,然后根据最后的变量值追加。
猜你喜欢
  • 1970-01-01
  • 2018-04-21
  • 1970-01-01
  • 2012-03-28
  • 1970-01-01
  • 1970-01-01
  • 2017-12-21
  • 2016-11-14
  • 2017-06-08
相关资源
最近更新 更多