似乎无法让Reegex匹配

时间:2019-07-18 21:53:02

标签: java

所以我试图从字符串中获取十六进制颜色。经过一番研究和尝试,我找到了这段代码。

这里的代码是:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * Find out if a String contains a very simple pattern.
 */
public class PatternMatcherFind {

    private static final String HEX_PATTERN = "^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$";

    public static void main(String[] args) {

        String stringToSearch = "we have got white #ffffff and black #000000 wohooo!";

        Pattern p = Pattern.compile(HEX_PATTERN); // the pattern to search for
        Matcher m = p.matcher(stringToSearch);

        // now try to find at least one match
        if (m.find())
            System.out.println("Found a match");
        else
            System.out.println("Did not find a match");

    }
}

使用它总是说除了我们有两个之外没有其他比赛。如果字符串只是“ #hex”,没有其他字符,那就没问题了。

所以我想要完成的是 获取它以检测该字符串中是否存在十六进制并获取其后的文本

示例: 此字符串“我们有白色#ffffff和黑色#000000 wohooo!” 应该给我们

ffffff和黑色

000000 wohooo!

我知道我们可以通过 while(matcher.find()){然后打印group(0)和group(1),但我的正则表达式现在似乎无法正常工作。

2 个答案:

答案 0 :(得分:1)

由于边界匹配(^-行的开头,$-行的结尾),您的模式在句子的中间找不到任何十六进制。这就是为什么它仅匹配#hex个相似的字符串的原因。

您可以摆脱它们,以便在句子中找到颜色:

private static final String HEX_PATTERN = "#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})"

... 但是但我不相信您应该如何进行操作以满足您的要求。

相反,您可以考虑以下内容:

import java.util.Arrays;
import java.util.regex.Pattern;

public class PatternMatcherFind {

    // ^                - String starts with
    // [A-Fa-f0-9]{6}   - 6 chars long color literal
    // |                - or
    // [A-Fa-f0-9]{3}   - 3 chars long color literal
    private static final String STARTS_WITH_COLOR_LITERAL = "^[A-Fa-f0-9]{6}|[A-Fa-f0-9]{3}";
    private static final Pattern pattern = Pattern.compile(STARTS_WITH_COLOR_LITERAL);

    public static void main(String[] args) {
        String stringToSearch = "we have got white #ffffff and black #000000 wohooo!";
        Arrays.stream(stringToSearch.split("#"))               // splitting on "#" will create array [ "we have got white ", "ffffff and black ", "000000 wohooo!" ]
                .skip(1)                                       // we may omit first one as it would never start with color literal
                .filter(part -> pattern.matcher(part).find())  // we keep only those Strings which starts with color literal
                .forEach(System.out::println);                 // may print them or whatever
    }
}

对于上面的代码,输出符合预期:

  

ffffff和黑色

     

000000 wohooo!

答案 1 :(得分:0)

特殊字符“ ^”仅匹配字符串的开头。特殊字符“ $”仅匹配字符串的结尾。

如果要在字符串中间找到模式的其余部分,请不要在模式中使用特殊字符“ ^”和“ $”。