使用 Java 从 CSS 中提取十六进制颜色

4

我只是想从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) {
    }

我并没有看到你实际将 HEX_PATTERN_STRING 与你的 Marcher 关联起来。 - Graham Nicol
2
尝试使用final String HEX_PATTERN_STRING =“#(?:[A-Fa-f0-9] {6} | [A-Fa-f0-9] {3})”;,并在以Matcher matcher开头的行之前添加Pattern pattern = Pattern.compile(HEX_PATTERN_STRING); - Wiktor Stribiżew
2个回答

2
请注意,您的模式包含^(字符串开头)和$(字符串结尾)锚点,需要完整的字符串匹配。
您需要删除这些锚点。
您也不能像在Java regex中那样使用正则表达式分隔符/.../,您可以将修饰符作为(?i)传递到模式中,或者使用Pattern.CASE_INSENSITIVE标志(通常与Pattern.UNICODE_CASE一起使用)。
此外,如果您不仅需要数字,则可以将捕获组转换为非捕获(?:...)
使用:
final String HEX_PATTERN_STRING = "#(?:[A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})";

我的错,我刚刚忘记在代码中添加这一行 pattern = Pattern.compile(HEX_PATTERN_STRING); ,顺便声明一下我正在更新问题。 - Mak
我相信你所需要的就是删除锚点。我进行了双重检查:你可以将 StringBuilder 传递给 matcher,因为它在 Java 内部被转换为字符串。 - Wiktor Stribiżew
@wikitor pattern.matcher(result.toString())pattern.matcher(result)是一样的,我猜。但是我还是尝试了result.toString(),但没有成功。 - Mak
我知道,我修改了答案。 - Wiktor Stribiżew
1
哦,该死,你是对的。^$需要整个字符串匹配,我刚刚把它们移除了,现在它可以工作了。 - Mak
显示剩余2条评论

0

我正在使用这个模式:

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

它可以接受像颜色值这样的参数

#FFF
#FFFFFF

并忽略无效的颜色值,例如

#FFFF or #FFFFFFF

这个正则表达式将在这里失败:https://regex101.com/r/JaYv3f/1。原始问题没有设置在哪里查找代码的任何条件,单词边界可能不是在这里使用的最佳选项。 - Wiktor Stribiżew
但是你的模式也会找到像 #ffff 这样的颜色值。我刚刚在我的 HTML 编辑器应用程序中检查了一下,它会将所有十六进制颜色值与相应的颜色进行高亮显示。 - neoexpert
在你的例子中有两个不正确的颜色代码。因此,我的模式似乎是正确的。 - neoexpert
#ffff is a string containing #fff color code and a letter f - Wiktor Stribiżew
是的,至少Chrome浏览器不接受那样的CSS颜色代码。 - neoexpert

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接