2012-01-19 2 views
-2

Я использую Java ....регулярного выражения для класса CSS

.MainNav a:hover{ float:left; width:70px; height:65px; border-top: 2px Solid #F4E6CC; border-bottom: 2px Solid #805822; border-left: 2px Solid #F4E6CC; border-right: 2px Solid #805822; margin: 0px 0px 0px 0px; align:center; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 10px; font-weight: bold; color: #FFFFFF; text-decoration: none; text-align: center; background:#C99349; background-image: url(../../images/hor_nav_bg.gif); background-repeat: repeat-X; padding:4px; clear:left; } 

выше класс CSS я хочу регулярное выражение, что группа содержит значение, как

group1 = MainNav a:hover

group2 = { float:left; width:70px; height:65px; border-top: 2px Solid #F4E6CC; border-bottom: 2px Solid #805822; border-left: 2px Solid #F4E6CC; border-right: 2px Solid #805822; margin: 0px 0px 0px 0px; align:center; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 10px; font-weight: bold; color: #FFFFFF; text-decoration: none; text-align: center; background:#C99349; background-image: url(../../images/hor_nav_bg.gif); background-repeat: repeat-X; padding:4px; clear:left; }

означает, что имя класса и другое - это определение, можете ли вы рассказать мне о регулярном выражении? Я немного путаюсь, как создать выражение для этого, чтобы я мог получить результат.

Вот мой код

package com.tufan.digite.Count; 
import java.io.BufferedReader; 
import java.io.DataInputStream; 
import java.io.FileInputStream; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.util.regex.Matcher; 
import java.util.regex.Pattern; 
public class GetAllCssFile { 
    public static void main(String args[]) throws IOException { 
     try { 
      FileInputStream fstream = new FileInputStream("D:/digite/work/digite/WEBUI/common/theme1/common.css"); // Get theobject of DataInputStream 
      DataInputStream dis = new DataInputStream(fstream); 
      BufferedReader br = new BufferedReader(new InputStreamReader(dis)); 
      String strLine; 
      while ((strLine = br.readLine()) != null) { 
       Matcher matcher = Pattern.compile("([^}]^)({[^}]+})", Pattern.DOTALL | Pattern.MULTILINE).matcher(strLine); 
       if (matcher.find()) { 
        String selector = matcher.group(1); 
        String definition = matcher.group(2); 
        System.out.println("selector:" + selector + "definition:"+definition); 
       } 
      } 
     } catch (Exception e) { 
      //Do some exception handling here 
     } 
    } 
} 

он не будет давать какие-либо ответы

+0

Осознайте, что '}' также может быть помещен в комментарий: 'p {/ *} */color: #FFFFFF; } ' –

+0

1. ПОЖАЛУЙСТА, сделайте синтаксис своего кода. Добавление его как одной строки просто не будет. Я исправил это. 2. Не рекомендуется использовать краткую форму слов и сокращений в контексте вашего вопроса. –

+0

На стороне примечания, вам не нужно использовать DataInputStream здесь (или практически где-либо еще, если на то пошло). Просто передайте FileInputStream непосредственно в InputStreamReader. –

ответ

2

Это должно сделать работу, если вы хотите его в JavaScript.

var regex = /([^\}\{]+)(\{[^\}]+\})/mi; 

И это будет работать на Java:

Matcher matcher = Pattern.compile("([^\\}\\{]+)(\\{[^\\}]+\\})", Pattern.DOTALL | Pattern.MULTILINE).matcher(content); 

Затем вызывая matcher.find(); возвратит группы:

if (matcher.find()) { 
    String selector = matcher.group(1); 
    String definition = matcher.group(2); 
} 

Проблема с вашего кода является то, что вы согласования текста построчно. Это, конечно, не сработает.

Подумайте о том, класс, как это:

public class CssDefinition { 
    private String selector; 
    private String definition; 
    //Appropriate getters and setters go here. 
} 

Вот правильно версия кода:

public static void main(String args[]) throws IOException { 
    FileInputStream fstream = null; 
    try { 
     fstream = new FileInputStream("D:/digite/work/digite/WEBUI/common/theme1/common.css"); // Get theobject of DataInputStream 
     DataInputStream dis = new DataInputStream(fstream); 
     BufferedReader br = new BufferedReader(new InputStreamReader(dis)); 
     StringBuffer buffer = new StringBuffer(); 
     String strLine; 
     while ((strLine = br.readLine()) != null) { 
      buffer.append(strLine).append("\n"); 
     } 
     String content = buffer.toString(); 
     content = content.replaceAll("(?s)/\\*.*?\\*/", ""); //This is to remove the comments from the CSS 
     Matcher matcher = Pattern.compile("([^\\}\\{]+)(\\{[^\\}]+\\})", Pattern.DOTALL | Pattern.MULTILINE).matcher(content); 
     Set<CssDefinition> definitions = new HashList<CssDefinitions>(); 
     while (matcher.find()) { 
      CssDefinition definition = new CssDefinition(); 
      definition.setSelector(matcher.group(1)); 
      definition.setDefintion(matcher.group(2)); 
      definitions.add(definition); 
     } 
     //After this the set `definitions` will contain the extracted data 
    } catch (Exception e) { 
     //Do some exception handling here 
    } finally { 
     if (fstream != null) { 
      fstream.close(); //Always release your resources 
     } 
    } 
} 

Также отметим, что в приведенном выше коде, я сначала удалить все комментарии ваш CSS. Это, чтобы сделать код способен правильно анализировать коды CSS, как это:

b { 
    font-weight: bold; /* This is a {test} */ 
} 

С без удаления комментариев первых это даст вам:

String selector = "b"; 
String definition = "{\nfont-weight: bold; /* this is a {test}" 

вместо:

String selector = "b"; 
String definition = "{\n\tfont-weight: bold; /* this is a {test}\n}" 
+0

Я хочу его в java – Vaishali

+0

Добавьте его и на Java. –

+0

Я обновил ответ. Кроме того, обратите внимание, что вы неправильно удалили escaping '\' перед символами '{' и '}'. Поскольку они являются особыми символами синтаксиса регулярных выражений, вы не должны удалять экранирование. –

Смежные вопросы