有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

使用java从css中提取十六进制颜色

我只是想让所有的十六进制颜色值形成一个css文件。 十六进制值可以是#fff或#ffffff,所以这里是我用于此的正则表达式

  • "^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$"
  • "#([a-f0-9]{3}){1,2}/i"
  • "^#[0-9a-zA-F]{3}"

但根本不起作用

我期待着这样的结果

#996633 #333 #ccc #969696 ....

但是什么都没有,知道我哪里出了问题吗

代码如下:

final String HEX_PATTERN_STRING = "^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$";
Pattern pattern = Pattern.compile(HEX_PATTERN_STRING);
try {
        final URL CSS = new URL("https://maxcdn.bootstrapcdn.com/.../bootstrap.min.css");
        URLConnection data = CSS.openConnection();
        StringBuilder result = new StringBuilder();
        try (BufferedReader in = new BufferedReader(
                new InputStreamReader(
                        data.getInputStream())
        )) {
            in.lines().forEach(result::append);

            Matcher matcher = pattern.matcher(result);
            while (matcher.find()) {
                System.out.println(matcher.group(0));
            }
            System.out.println("Done");
        }

    } catch (IOException ex) {
    }

共 (2) 个答案

  1. # 1 楼答案

    我正在使用这种模式:

    Pattern PATTERN_HEXCOLOR = Pattern.compile(
        "#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})\\b");
    

    它确实接受像这样的颜色值

    #FFF
    #FFFFFF
    

    并忽略无效的颜色值,如

    #FFFF or #FFFFFFF
    
  2. # 2 楼答案

    注意,您的模式包含^(字符串的开头)和$(字符串的结尾)锚,需要整个字符串匹配

    你需要移除这些锚

    您不能使用像/.../这样的正则表达式分隔符,就像在Java正则表达式中一样,您可以在模式内以(?i)的形式传递修饰符,或者在Pattern.CASE_INSENSITIVE标志的帮助下传递修饰符(通常使用Pattern.UNICODE_CASE

    此外,如果您不需要数字,您可以将捕获组转换为非捕获(?:...)

    使用

    final String HEX_PATTERN_STRING = "#(?:[A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})";