3

我正在使用这个正则表达式/\s*?left:\s*?-?\d+\.?\d*px;/im来查找例如:left: 100.5px;.

问题是它也找到margin-left: 100px;或者padding-left...我希望它不匹配诸如-left但匹配的单词left

有任何想法吗?

编辑:我将它与 javascript 一起使用。我为此做了一个简单的jsfiddle。http://jsfiddle.net/WU7GV/3/目标是让“jupp”出现,但不是“nope”在两个 if 句中使用相同的正则表达式

4

5 回答 5

3

选项 1:使用起始锚点:

/^left:\s*-?\d+\.?\d*px;/im

选项 2:如果您不能使用起始锚点,因为这可能不是输入文本的实际开始,那么您可以使用带有否定后视的单词边界,如下所示:

/(?<!-)\bleft:\s*-?\d+\.?\d*px;/im

现场演示:http ://www.rubular.com/r/o1lsRU9mmE

更新:没有负前瞻的 Javascript 解决方法:

var re=/\b.*?(left:\s*-?\d+\.?\d*px;)/igm;

function matchIt(str) {
   repl = str.replace(re, function($0, $1) {
      return $0 == $1? $0 : '';
   });
   return repl != ""? true : false;
}

console.log(matchIt('margin-left:100px;')); // false
console.log(matchIt('left:100px;')); // true

现场演示:http: //ideone.com/xt1kPH

于 2013-04-24T14:57:44.437 回答
2

使用表达式开始锚

/^\s*?left:\s*?-?\d+\.?\d*px;/im

除了 之外,还可以有其他指标px,但我相信您知道这一点。

于 2013-04-24T14:52:57.180 回答
0

使用字符串的开头(和结尾)anchor,如下所示:

/^\s*?left:\s*?-?\d+\.?\d*px;$/im

于 2013-04-24T14:54:10.003 回答
0

使用单词边界

[^(left)]*\b\s*?(left:\s*?-?\d+\.?\d*px;)

所以它会寻找任何不是“左”的东西,一个词边界,如上面的链接中所述。然后你的 ( group) 返回你想要的。

如果您指定此正则表达式使用的语言,它将帮助我们回答您的问题。否则,试试 www.debuggex.com 的交互式正则表达式调试器!

于 2013-04-24T15:07:08.303 回答
0

尝试使用这个正则表达式:

/([^-]left|^left):.*?;/im

如果您的字符串以“left”开头或包含“left”但不包含“-left”的字符串,这将匹配。

如果你不关心你的风格单位,.*?; 是匹配从 : 到最近的所有内容的好速记;.

如果您只需要匹配 px 而不是 %;、pt;、em !important; 等...,请在 : 之后保留相同的正则表达式,尽管我认为非贪婪空间:

\s*?

是不必要的,即,您可以只使用:

/([^-]left|^left):\s*-?\d+\.?\d*px;/im
于 2013-06-24T19:01:40.830 回答