2016-08-23 120 views
3

我只是试图从一个css文件中获取所有的十六进制颜色值。 十六进制值可以#FFF或#FFFFFF所以这里的正则表达式我用这个使用java从css中提取十六进制颜色

  • "^#([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) { 
    } 
+0

我看不出你居然关联'HEX_PATTERN_STRING'你随时随地行军。 –

+2

尝试使用'final String HEX_PATTERN_STRING =“#(?:[A-Fa-f0-9] {6} | [A-Fa-f0-9] {3})”;'并添加Pattern Pattern = Pattern。编译(HEX_PATTERN_STRING);'在Matcher匹配器开始的行之前。 –

回答

2

注意你的模式包含^(字符串的开始)和$锚(字符串的结尾),要求整个字符串匹配。

您需要删除这些锚点。

不能使用正则表达式的分隔符像/.../或者,如Java的正则表达式,你可以通过调节剂为(?i)的模式里面,或者用Pattern.CASE_INSENSITIVE标志的帮助(通常,与Pattern.UNICODE_CASE)。

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

使用

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

我不好,我只是忘了把这行'pattern = Pattern.compile(HEX_PATTERN_STRING);'在我的代码btw我宣布paatern。我正在更新问题 – Mak

+0

不要忘记指出您的预期结果并解释“不起作用”的含义。 –

+0

我相信你所需要的只是去除锚点。我再次检查:您可以将'StringBuilder'传递给'matcher',因为它被Java转换为内部的字符串。 –