Verify if String matches a format String

前端 未结 7 1792
旧巷少年郎
旧巷少年郎 2021-02-13 09:15

In Java, how can you determine if a String matches a format string (ie: song%03d.mp3)?

In other words, how would you implement the following function?

7条回答
  •  野性不改
    2021-02-13 09:36

    I don't know of a library that does that. Here is an example how to convert a format pattern into a regex. Notice that Pattern.quote is important to handle accidental regexes in the format string.

    // copied from java.util.Formatter
    // %[argument_index$][flags][width][.precision][t]conversion
    private static final String formatSpecifier
        = "%(\\d+\\$)?([-#+ 0,(\\<]*)?(\\d+)?(\\.\\d+)?([tT])?([a-zA-Z%])";
    
    private static final Pattern formatToken = Pattern.compile(formatSpecifier);
    
    public Pattern convert(final String format) {
        final StringBuilder regex = new StringBuilder();
        final Matcher matcher = formatToken.matcher(format);
        int lastIndex = 0;
        regex.append('^');
        while (matcher.find()) {
            regex.append(Pattern.quote(format.substring(lastIndex, matcher.start())));
            regex.append(convertToken(matcher.group(1), matcher.group(2), matcher.group(3), 
                                      matcher.group(4), matcher.group(5), matcher.group(6)));
            lastIndex = matcher.end();
        }
        regex.append(Pattern.quote(format.substring(lastIndex, format.length())));
        regex.append('$');
        return Pattern.compile(regex.toString());
    }
    

    Of course, implementing convertToken will be a challenge. Here is something to start with:

    private static String convertToken(String index, String flags, String width, String precision, String temporal, String conversion) {
        if (conversion.equals("s")) {
            return "[\\w\\d]*";
        } else if (conversion.equals("d")) {
            return "[\\d]{" + width + "}";
        }
        throw new IllegalArgumentException("%" + index + flags + width + precision + temporal + conversion);
    }
    

提交回复
热议问题