在String中匹配css margin属性

时间:2012-04-24 07:41:20

标签: java regex

我正在用Java写一个正则表达式,我试图找到字符串中css "margin:" shorthand property的底部边距,看看它是否为负数。 margin属性可以指定为1,2,3或4个值,以 px em 结尾,值可能为负值和/或以点开头。值之间用一个或多个空格分隔。到目前为止所尝试的是这样的正则表达式:

//E.g. style may look like "... margin: 10px 2px" or "... margin: -.10em 1em 2em" etc.
public void findMargin(String style)
{
    Pattern compile = Pattern.compile("margin:\\s*(-?\\.?\\d+(?:em|px|%)\\s*){1,4}");
    Matcher matcher = compile.matcher(style);

    while (matcher.find())
    {
      .....
    }
}

我有问题找到提取底部边距属性。任何人都有关于如何实现这一目标的一些意见?

3 个答案:

答案 0 :(得分:2)

我倾向于从单个组中获取整个属性,然后执行简单的字符串拆分以获取单个值。

答案 1 :(得分:0)

可能更冗长,但也更具可读性?

    // sample input string
    String style = "...margin: -.10px 1px 2px;...";        

    // pre-compile patterns
    Pattern marginPattern = Pattern.compile("margin:([^;]+);");
    Pattern valuePattern = Pattern.compile("([\\-\\.\\d]+)(em|px|%)");

    // first step, find margin property...
    Matcher marginMatcher = marginPattern.matcher(style);
    while (marginMatcher.find()) {
        // second step, extract individual numeric values
        String marginPropertyValue = marginMatcher.group(1).trim();
        Matcher valueMatcher = valuePattern.matcher(marginPropertyValue);
        while (valueMatcher.find()) {
            String number = valueMatcher.group(1);
            String unit = valueMatcher.group(2);
            doSomethingWith(number, unit);
        }
    }

答案 2 :(得分:0)

这是我编写的代码,用于从css margin速记属性中找到底部边距:

    Pattern compile1 = Pattern.compile("margin:\\s*((-?\\.?\\d+(?:em|px|%)\\s*){1,4})");
    Matcher matcher1 = compile1.matcher(style);

    if (matcher1.find())
    {
        String[] split = matcher1.group(1).trim().split("\\s+");
        String marginBottom;

        if (split.length < 3)
        {
            marginBottom = split[0];
        } else
        {
            marginBottom = split[2];
        }

        if (marginBottom.contains("-"))
        {
            System.err.println("Bottom margin is negative "  + marginBottom);
        }
    }