2012-04-24 15 views
1

Javaでregexpを書いています。ここで、css "margin:" shorthand propertyの文字列のボトムマージンを見つけて、それが否定的かどうかを調べようとしています。 マージンプロパティは1、2、3または4の値で指定することができ、PXEM又は%で終了し、値が負であるかもしれない及び/又はドットで始まります。値は1つ以上の空白で区切られます。これまでの試行は、次のような正規表現です:StringのマッチングCSSマージンのプロパティ

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

ボトムマージンの抽出を見つけるのに問題があります。誰もそれを達成する方法についてのいくつかの入力を持っていますか?

答えて

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); 
     } 
    } 
2

私は単一のグループから全体のプロパティを取得し、個々の値を取得するために単純な文字列分割を行う傾向があります。

+0

私はそれが少し単純取得あなたのソリューションで行くと思います。ありがとうございました! –

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); 
     } 
    }