1

我正在用Java编写一个正则表达式,我试图在字符串中的css“margin:”速记属性中找到下边距,看看它是否为负。可以使用 1、2、3 或 4 个值指定边距属性,以pxem%结尾,这些值可能为负数和/或以点开头。值之间用一个或多个空格分隔。到目前为止尝试的是这样的正则表达式:

//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())
    {
      .....
    }
}

我很难找到提取底边距属性。有人对如何实现这一目标有一些意见吗?

4

3 回答 3

2

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

于 2012-04-24T07:49:31.153 回答
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);
        }
    }
于 2012-04-24T08:01:53.937 回答
0

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

    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);
        }
    }
于 2012-04-24T11:45:33.127 回答