如何将#ffffff
转换为#fff
或将#fff
转换为#ffffff
进行断言?
我正在使用 Selenium 中的getCssValue("background")
,它返回rgb(255, 255, 255)
,我可以将其拆分为:
255
255
255
下面的代码行:
String hex = String.format("#%02x%02x%02x", r, g, b);
将 rgb 转换为 hex 并给出如下输出:
#ffffff
但是从控制台中,背景被提取为 #fff
那么什么是以下理想的方式?
#ffffff
转换为#fff
#fff
转换为#ffffff
我经历了一些相关的讨论,
但是我的测试失败了,需要进行转换。有什么建议吗?
答案 0 :(得分:3)
您可以将replaceAll
与正则表达式一起使用,以查找所有三个部分使用相同数字的情况:
static String getHex(int r, int g, int b) {
return String.format("#%02x%02x%02x", r, g, b).replaceAll("^#([a-fA-F])\\1([a-fA-F])\\2([a-fA-F])\\3$", "#$1$2$3");
}
寻找一个以#
开头的字符串,然后是三对匹配的十六进制数字,然后将它们替换为短格式。 (我想在您的特定示例中,我可能只使用[a-f]
而不是[a-fA-F]
,因为您知道您只会使用小写字母,但是...)< / p>
完整示例(在Ideone上):
public class Example {
public static void main(String[] args) {
System.out.println(getHex(255, 255, 255)); // #fff
System.out.println(getHex(255, 240, 255)); // #fff0ff
}
static String getHex(int r, int g, int b) {
return String.format("#%02x%02x%02x", r, g, b).replaceAll("^#([a-fA-F])\\1([a-fA-F])\\2([a-fA-F])\\3$", "#$1$2$3");
}
}
答案 1 :(得分:3)
您可以编写一个简单的方法,将HTML颜色代码“标准化”为短格式或长格式 ,如果它们都具有相同的十六进制数字:
public static void main(String[] args) {
System.out.println(normalizeHtmlColors("#ffffff", true));
System.out.println(normalizeHtmlColors("#fff", true));
System.out.println(normalizeHtmlColors("#ffffff", false));
System.out.println(normalizeHtmlColors("#fff", false));
}
public static String normalizeHtmlColors(String colorCode, boolean toShort) {
if (toShort && colorCode.matches("^#?([0-9a-fA-F])\\1{5}$"))
colorCode = colorCode.replaceFirst("#?([0-9a-fA-F])\\1{5}", "#$1$1$1");
else if (!toShort && colorCode.matches("^#?([0-9a-fA-F])\\1{2}$"))
colorCode = colorCode.replaceFirst("#?([0-9a-fA-F])\\1{2}", "#$1$1$1$1$1$1");
return colorCode;
}
这将打印:
#fff
#fff
#ffffff
#ffffff
...因此您可以决定向哪个方向转换。如果输入的两种情况不匹配,则将返回它。