我在Javascript中有这个正则表达式:
0x[A-F0-9]{2}\g
我想修改它,以便在前一个字符不是\
时获得匹配。
这样的事情:
0x60
- >真\0x60
- >假我出现了类似的东西,但它没有正常工作:
[^\\]0x[A-F0-9]{2}\g
它匹配除\
之外的所有内容,其中一切是我的意思:
a0x50
- >是的,包括“a”_0x50
- >是的,包括“_”\0x50
- >假有可能实现这一目标吗? 感谢。
答案 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}
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;
正则表达式解释:
(?:[^\\]|^)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中还有其他模拟外观的方法。我最喜欢的是翻转字符串并使用前瞻。
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;