正则表达式背后js

时间:2016-05-05 20:05:30

标签: javascript regex

我在Javascript中有这个正则表达式:

0x[A-F0-9]{2}\g

我想修改它,以便在前一个字符不是\时获得匹配。 这样的事情:

  • 0x60 - >真
  • \0x60 - >假

我出现了类似的东西,但它没有正常工作:

[^\\]0x[A-F0-9]{2}\g

它匹配除\之外的所有内容,其中一切是我的意思:

  • a0x50 - >是的,包括“a”
  • _0x50 - >是的,包括“_”
  • ...
  • \0x50 - >假

正则表达式示例:regex101,后跟Plnkr

有可能实现这一目标吗? 感谢。

5 个答案:

答案 0 :(得分:1)

JavaScript并不支持lookbehinds,正如您已经建议的那样,以下内容会消耗额外的字符(0x之前的字符):

/[^\\]0x[A-F0-9]{2}/g

你可以做一些丑陋的黑客,比如:

'\\0x25 0x60'.match(/([^\\]|^)0x[A-F0-9]{2}/g).map(function(val) {
  return val.slice(1);
});
['0x60']

将消耗前导字符,但通过对matches数组的迭代将其删除。

然而,这会使0x600x60之类的输入提供['0x60']而不是['0x60', '0x60']

答案 1 :(得分:1)

主要的一点是将通常用于负面观察的模式与可选捕获组相匹配,然后检查该组是否匹配。如果确实如此,则不需要匹配,否则请使用它。

如果您需要匹配和收集子字符串,请使用

var re = /(\\?)0x[A-F0-9]{2}/gi; 
var str = '\\0x50 0x60 asdasda0x60';
var res = [];
while ((m = re.exec(str)) !== null) {
	if (!m[1]) {
  	res.push(m[0]); 
  }
}
document.body.innerHTML = "TEST: " + str + "<br/>";
document.body.innerHTML += "RES: " + JSON.stringify(res,0,4) + "<br/>";

如果您需要替换仅在\ 之前没有0x..的字符串,请在{{1}中使用回调检查组1是否匹配的方法。如果是,请替换整个匹配,如果没有,只需替换为您需要的模式。

replace

答案 2 :(得分:1)

你可以匹配坏事和好事 这将使它与所有商品保持一致,这样你就不会错过任何商品。

(?:\\0x[A-F0-9]{2}|(0x[A-F0-9]{2}))

在这种情况下,只有好处出现在捕获组1中。

 (?:
      \\ 0x [A-F0-9]{2}     # Bad
   |  
      ( 0x [A-F0-9]{2} )    # (1), Good
 )

答案 3 :(得分:0)

这样做:

(?:[^\\]|^)0x[A-F0-9]{2}

&#13;
&#13;
var myregexp = /(?:[^\\]|^)0x[A-F0-9]{2}/mg;
var subject = '0x60 \0x99 0x60 \0x99 0x60 0x60';
var match = myregexp.exec(subject);
while (match != null) {
	for (var i = 0; i < match.length; i++) {
		document.body.innerHTML += match[i]+ "<br/>";
	}
	match = myregexp.exec(subject);
}
&#13;
&#13;
&#13;

正则表达式解释:

(?:[^\\]|^)0x[A-F0-9]{2}

Match the regular expression below «(?:[^\\]|^)»
   Match this alternative (attempting the next alternative only if this one fails) «[^\\]»
      Match any character that is NOT the backslash character «[^\\]»
   Or match this alternative (the entire group fails if this one fails to match) «^»
      Assert position at the beginning of a line (at beginning of the string or after a line break character) (line feed, line feed, line separator, paragraph separator) «^»
Match the character string “0x” literally (case insensitive) «0x»
Match a single character present in the list below «[A-F0-9]{2}»
   Exactly 2 times «{2}»
   A character in the range between “A” and “F” (case insensitive) «A-F»
   A character in the range between “0” and “9” «0-9»

答案 4 :(得分:0)

如果您正在使用Node,或者愿意打开浏览器标记(来自this is not yet possible),那么您很幸运:

  

Lookbehind断言目前处于TC39规范流程的早期阶段。但是,因为它们是RegExp语法的明显扩展,所以我们决定优先实现它们的实现。您可以通过使用--harmony运行V8 4.9或更高版本,或者从版本49开始在Chrome中启用实验性JavaScript功能(使用about:flags)来尝试使用lookbehind断言。

现在当然只是

/(?<!\\)0x[A-F0-9]{2}/g

在此here中还有其他模拟外观的方法。我最喜欢的是翻转字符串并使用前瞻。

&#13;
&#13;
var re = /[A-F0-9]{2}x0(?!\\)/g;
var str = "0x60 \0x33";

function reverse(s) { return s.split('').reverse().join(''); }

document.write(reverse(str).match(re).map(reverse));
&#13;
&#13;
&#13;