我们应该如何验证正则表达式语法

How should we validate regex syntax

我们的用户可以向我们的应用程序提供一些我们应该对其进行匹配的正则表达式。因此,我们希望在用户输入时验证输入。

我们可以使用以下代码来做到这一点:

    try {
        new String().matches(regEx);
    } catch (PatternSyntaxException e) {
        errors.addError(TASK_DETAILS.value(), "Invalid regular expression. " + e.getMessage());
    }

但是,我们用来检查代码覆盖率的 SonarQube 将对 matches up 的调用标记为错误,并声称:'Return values from functions without side effects should not be ignored'。我可以通过将对 matches 的调用放在名为 'parse' 或 'format' 的方法中来消除该错误,但我确实在验证,所以我希望我的方法开始 'validate'.

是否有更好的方法来检查语法是否有效?

您可以拨打Pattern.compile。但是这个 return 是一个 Pattern,SQ 可能希望你不要忽略它。

将您的代码包装到一个 return 是 boolean 的方法中。

private boolean regexIsValid(String regex) {
  try {
    return Pattern.compile(regex) != null;
  } catch (PatternSyntaxException e) {
    return false;
  }
}

然后调用这个方法。

if (regexIsValid(regex)) {
  errors.addError(TASK_DETAILS.value(), "Invalid regular expression. ");
}

如果您需要 PatternSyntaxException 的详细信息,return 来自 regexIsValidOptional<String> 并检查它。

private Optional<String> regexIsValid(String regex) {
  try {
    Pattern pattern = Pattern.compile(regex);
    return Optional.empty();
  } catch (PatternSyntaxException e) {
    return Optional.of(e.getMessge());
  }
}
Optional<String> regexErrorMessage = regexIsValid(regex);
if (regexErrorMessage.isPresent()) {
  errors.addError(TASK_DETAILS.value(), "Invalid regular expression. " + regexErrorMessage.get());
}