/** * Converts XSD regex to Java-compatible regex. * * @param xsdRegex XSD regex pattern as it is defined in a YANG source * @return Java-compatible regex */ public static String getJavaRegexFromXSD(final String xsdRegex) { // Note: we are using a non-capturing group to deal with internal structure issues, like branches and similar. return "^(?:" + fixUnicodeScriptPattern(escapeChars(xsdRegex)) + ")$"; }
@Override public final PatternConstraint parseArgumentValue(final StmtContext<?, ?, ?> ctx, final String value) { final String pattern = RegexUtils.getJavaRegexFromXSD(value); try { Pattern.compile(pattern); } catch (final PatternSyntaxException e) { LOG.debug("Pattern \"{}\" failed to compile at {}", pattern, ctx.getStatementSourceReference(), e); return null; } return new PatternConstraintImpl(pattern, value, Optional.empty(), Optional.empty()); }
private static String fixUnicodeScriptPattern(String rawPattern) { for (int i = 0; i < UNICODE_SCRIPT_FIX_COUNTER; i++) { try { Pattern.compile(rawPattern); return rawPattern; } catch (final PatternSyntaxException ex) { LOG.debug("Invalid regex pattern syntax in: {}", rawPattern, ex); final String msg = ex.getMessage(); if (msg.startsWith("Unknown character script name") || msg.startsWith("Unknown character property name")) { rawPattern = fixUnknownScripts(msg, rawPattern); } else { return rawPattern; } } } LOG.warn("Regex pattern could not be fixed: {}", rawPattern); return rawPattern; }
private static boolean reMatch(final Context context, final List<?> args) throws FunctionCallException { if (args == null || args.size() != 2) { throw new FunctionCallException("re-match() takes two arguments: string subject, string pattern."); } final Object subject = args.get(0); if (!(subject instanceof String)) { throw new FunctionCallException("First argument of re-match() should be a String."); } final Object pattern = args.get(1); if (!(pattern instanceof String)) { throw new FunctionCallException("Second argument of re-match() should be a String."); } return ((String) subject).matches(RegexUtils.getJavaRegexFromXSD((String) pattern)); }
private static String fixUnicodeScriptPattern(String rawPattern) { for (int i = 0; i < UNICODE_SCRIPT_FIX_COUNTER; i++) { try { Pattern.compile(rawPattern); return rawPattern; } catch (final PatternSyntaxException ex) { LOG.debug("Invalid regex pattern syntax in: {}", rawPattern, ex); final String msg = ex.getMessage(); if (msg.startsWith("Unknown character script name") || msg.startsWith("Unknown character property name")) { rawPattern = fixUnknownScripts(msg, rawPattern); } else { return rawPattern; } } } LOG.warn("Regex pattern could not be fixed: {}", rawPattern); return rawPattern; }
private static boolean reMatch(final Context context, final List<?> args) throws FunctionCallException { if (args == null || args.size() != 2) { throw new FunctionCallException("re-match() takes two arguments: string subject, string pattern."); } final Object subject = args.get(0); if (!(subject instanceof String)) { throw new FunctionCallException("First argument of re-match() should be a String."); } final Object pattern = args.get(1); if (!(pattern instanceof String)) { throw new FunctionCallException("Second argument of re-match() should be a String."); } return ((String) subject).matches(RegexUtils.getJavaRegexFromXSD((String) pattern)); }
/** * Converts XSD regex to Java-compatible regex. * * @param xsdRegex XSD regex pattern as it is defined in a YANG source * @return Java-compatible regex */ public static String getJavaRegexFromXSD(final String xsdRegex) { // Note: we are using a non-capturing group to deal with internal structure issues, like branches and similar. return "^(?:" + fixUnicodeScriptPattern(escapeChars(xsdRegex)) + ")$"; }