1

Java で正規表現を作成しています。ここでは、文字列のcss "margin:" 省略形プロパティで下マージンを見つけて、それが負かどうかを確認しようとしています。margin プロパティは、1、2、3、または 4 つの値で指定でき、pxemまたは%で終わります。値は負の値またはドットで始まる場合があります。値は 1 つ以上の空白で区切られます。これまでに試行されたのは、次のような正規表現です。

//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

1 つのグループからプロパティ全体を取得し、単純な文字列分割を行って個々の値を取得する傾向があります。

于 2012-04-24T07:49:31.153 に答える
0

This is the code I wrote to find the bottom-margin from the css margin shorthand property:

    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 に答える
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 に答える