正则表达匹配!重要的风格

时间:2014-04-25 17:27:59

标签: regex

我试图编写一个匹配任何分号符号;的正则表达式,该符号不以!important!important

开头

例如,如果我有以下字符串:

.myclass {
  width: 400px;
  color: #333;
  margin: 20px !important;
  padding: 20px !important ;
  top: 1px;
}

我想匹配这些行:

  width: 400px;
  color: #333;
  top: 1px;

然后,我可以对它们运行替换并将!important属性添加到它们。

我应该如何编写与此匹配的正则表达式?

4 个答案:

答案 0 :(得分:4)

尝试使用这个:(?!.*!important).*; 将它分解成更小的部分,我们使用负向前瞻(?!<pattern>)来表示我们希望匹配字符串中稍后不匹配的位置。在那之后,我们只需要查看任何字符,直到我们看到结束;。设置负向前瞻的方式,如果该行在;中结束并且与!important匹配,则无论中间有多少空格,它都将失败。由于CSS可以有空格,因此可以处理更多的情况,你可以看到0或1个空格。

如果您希望它与您在!important;之后检查零或一个空格的原始帖子完全相同,则可以将前瞻更改为包括\s?;,在!important当然之后。这是检查任何空格,零或一个,直接跟;

答案 1 :(得分:0)

这个对我有用Regex tester

.+[^((?!important)\s];

正则表达式匹配任意数量的字符(.+),但其中包含!important([^!important])除外。

答案 2 :(得分:0)

如果这完全是一个字符串变量

.myclass {
  width: 400px;
  color: #333;
  margin: 20px !important;
  padding: 20px !important ;
  top: 1px;
}

然后你可以将它拆分为新行:

String[] lines = input.split(System.getProperty("line.separator", "\r\n"));

然后,跳过第一个和最后一个元素(包含大括号),只获得匹配"!important ?;"

的行
Matcher importantMtchr = Pattern.compile("!important ?;").matcher("");
for(int i = 1; i < lines.length - 1; i++)  {
   String line = lines[i];
   if(!importantMtchr.reset(line).find())  {
      System.out.println(line);
   }
}

完整代码:

   import  java.util.regex.Pattern;
   import  java.util.regex.Matcher;

public class NotExclamationImportantLines  {
   public static final String LINE_SEP = System.getProperty("line.separator", "\r\n");

   public static final void main(String[] ignored)  {
      String input = new StringBuilder().
         append("myclass {"                 ).append(LINE_SEP).
         append("width: 400px;"             ).append(LINE_SEP).
         append("color: #333;"              ).append(LINE_SEP).
         append("margin: 20px !important;"  ).append(LINE_SEP).
         append("padding: 20px !important ;").append(LINE_SEP).
         append("top: 1px;"                 ).append(LINE_SEP).
         append("}"                         ).toString();

      //Split on the newline
      String[] lines = input.split(LINE_SEP);

      //Skip over the first and last elements, and only
      //print out those that don't contain the regular
      //expression `"important! ?"
      Matcher importantMtchr = Pattern.compile("!important ?;").matcher("");
      for(int i = 1; i < lines.length - 1; i++)  {
         String line = lines[i];
         if(!importantMtchr.reset(line).find())  {
            System.out.println(line);
         }
      }
   }
}

输出:

width: 400px;
color: #333;
top: 1px;

答案 3 :(得分:0)

^(?!.*!important\s*;).*?(;)\s*$
    ^^^^^^^^^^^^^^^^     ^
           (1)          (2)
  1. 否定前瞻声明:查找包含!important后跟零个或多个空格字符后跟分号的行。
  2. 捕获组:在通过否定前瞻测试的行中,仅在 处捕获一个分号,后面跟着零个或多个空白字符。
  3. 请参阅live demo