{"record":{"id":"08025933dde20b7e","repo":"pentaho/pentaho-kettle","slug":"s3fileoutput-error-invalidregex","errorCode":null,"errorMessage":"S3FileOutput.Error.InvalidRegex","messagePattern":"S3FileOutput\\.Error\\.InvalidRegex","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"plugins/s3-vfs/core/src/main/java/org/pentaho/amazon/s3/S3FileOutputHelper.java","lineNumber":214,"sourceCode":"      if ( fileMatchesFilter( file, filter, isRegex ) ) {\n        filteredFiles.add( file );\n      }\n    }\n    response.put( FILES_KEY, filteredFiles );\n    return response;\n  }\n\n  // Checks if file path matches filter criteria (regex or case-insensitive substring)\n  private boolean fileMatchesFilter( String file, String filter, String isRegex ) {\n    if ( Boolean.parseBoolean( isRegex ) ) {\n      if ( S3Util.isEmpty( filter ) ) {\n        return true;\n      }\n      try {\n        Matcher matcher = Pattern.compile( filter ).matcher( file );\n        return matcher.matches();\n      } catch ( PatternSyntaxException e ) {\n        throw new IllegalArgumentException(\n            BaseMessages.getString(\n                PKG,\n                \"S3FileOutput.Error.InvalidRegex\"\n            ) + \": \" + e.getDescription(),\n            e\n        );\n      }\n    } else {\n      return S3Util.isEmpty( filter ) || StringUtils.containsIgnoreCase( file, filter );\n    }\n  }\n\n  @SuppressWarnings( \"unchecked\" )\n  public JSONObject listS3BucketsAction( TransMeta transMeta, Map<String, String> queryParams ) {\n    JSONObject response = new JSONObject();\n    JSONArray buckets = new JSONArray();\n    try {\n      S3Details s3Details = createS3DetailsFromParams( transMeta, queryParams );","sourceCodeStart":196,"sourceCodeEnd":232,"githubUrl":"https://github.com/pentaho/pentaho-kettle/blob/f3058517a153da500bf4551f46d79b91bf8ec552/plugins/s3-vfs/core/src/main/java/org/pentaho/amazon/s3/S3FileOutputHelper.java#L196-L232","documentation":"S3FileOutputHelper.fileMatchesFilter compiles the user-supplied filename filter string as a Java regex and rethrows PatternSyntaxException as IllegalArgumentException with the localized message 'S3FileOutput.Error.InvalidRegex' plus the regex engine's description. It exists to surface a bad user-entered filter pattern with a clear message instead of a raw regex stack trace.","triggerScenarios":"showFilesAction -> fileMatchesFilter with a filter string that is not a valid Java regular expression, e.g. unbalanced '(' or '[', trailing backslash, or a dangling quantifier like '*csv'.","commonSituations":"User types a Windows-style glob with special characters in the S3 File Output filter field; copy-pasted globs with unmatched braces or brackets; filenames containing special regex characters treated as patterns.","solutions":["Read e.getDescription() in the message and fix the regex at that position (balance parentheses/brackets, escape special chars).","Escape literal characters (e.g. use \\. for a dot) or use Pattern.quote() around literal text.","If users need glob semantics, translate globs to regex (.* for *, . for ?) before compiling.","Validate the pattern with Pattern.compile() in the dialog before running the transformation."],"exampleFix":"// before\nMatcher matcher = Pattern.compile( filter ).matcher( file );\n// after: accept simple glob input\nString regex = filter.replace( \".\", \"\\\\.\" ).replace( \"*\", \".*\" ).replace( \"?\", \".\" );\nMatcher matcher = Pattern.compile( regex ).matcher( file );","handlingStrategy":"validation","validationCode":"// validate user filter before use\ntry {\n  java.util.regex.Pattern.compile( filter );\n} catch ( java.util.regex.PatternSyntaxException pse ) {\n  throw new IllegalArgumentException( \"Invalid filter regex at pos \" + pse.getIndex() + \": \" + pse.getDescription() );\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Escape regex metacharacters in literal filename filters (Pattern.quote)","Convert user globs (*, ?) to regex explicitly","Validate patterns in the UI dialog before running","Test filters against sample filenames"],"tags":["regex","validation","s3"],"backgroundTag":"invalid-regex-pattern","analyzedSha":"f3058517a153da500bf4551f46d79b91bf8ec552","analyzedAt":"2026-09-13T14:04:16.340Z","contentChangedAt":"2026-09-13T14:04:16.340Z","schemaVersion":2},"datasetVersion":"2026-09-20T23:17:15.980Z"}