Javascript 正则表达式获取两个字符之间的字符串,除了转义而不向后看

Javascipt regex to get string between two characters except escaped without lookbehind

我正在寻找没有 Javascript 2018 的新 lookahead/lookbehind 功能的特定 javascript 正则表达式,它允许我在两个星号之间 select 文本但忽略转义字符。

在以下示例中,只有文本“test”和包含的转义字符应该根据上述规则 selected: \*jdjdjdfdf*test*dfsdf\*adfasdasdasd*test**test\**sd*(选择:“测试”、“测试”、“测试\*”)

在我的研究过程中,我发现了这个解决方案 /(?<!\)(%.*?(?<!\)%)/ 但它使用了 javascript 2018 支持的负后视,但我也需要支持 IE11,所以这个解决方案不为我工作。

然后我发现了另一种方法,几乎​​可以在这里找到我:Javascript: negative lookbehind equivalent?。我更改了 Kamil Szot 的答案以满足我的需要:((?!([\])).|^)(\*.*?((?!([\])).|^)\*) 不幸的是,当两个星号 ** 连在一起时它不起作用。

我已经投入了很多时间,但似乎无法正确处理,感谢任何帮助!

我目前所拥有的示例如下:https://www.regexpal.com/?fam=117350

我需要在 string.replace 调用中使用正则表达式 (str.replace(regexp|substr, newSubStr|function); 这样我就可以用特定的 span 元素包装找到的字符串class.

您可以使用这个正则表达式:

(?:\.|[^*])*\*((?:\.|[^*])*)\*

然后您的代码应该只获取每个匹配项的(唯一)捕获组。

像这样:

var str = "\*jdjdjdfdf*test*dfsdf\*adfasdasdasd*test**test\**sd*";
var regex = /(?:\.|[^*])*\*((?:\.|[^*])*)\*/g

var match;
while (match = regex.exec(str)) {
    console.log(match[1]);
}

如果您需要 替换 匹配项,例如将匹配项包装在 span 标记中同时删除星号,则使用两个捕获组:

var str = "\*jdjdjdfdf*test*dfsdf\*adfasdasdasd*test**test\**sd*";
var regex = /((?:\.|[^*])*)\*((?:\.|[^*])*)\*/g

var result = str.replace(regex, "<span></span>");
console.log(result);

需要注意的一件事:在 JavaScript 测试中使用字符串文字时,请转义反斜杠(使用另一个反斜杠)。如果不这样做,字符串实际上 不会 有反斜杠!要真正得到内存中字符串中的反斜杠,需要对反斜杠进行转义。

const testStr = `\*jdjdjdfdf*test*dfsdf\*adfasdasdasd*test**test\**sd*`;
const m = testStr.match(/\*(\.)*t(\.)*e(\.)*s(\.)*t(\.)*\*/g).map(m => m.substr(1, m.length-2));
console.log(m);

更通用的代码:

const prepareRegExp = (word, delimiter = '\*') => {
  const escaped = '(\\.)*';
  return new RegExp([
    delimiter,
    escaped,
    [...word].join(escaped),
    escaped,
    delimiter
  ].join``, 'g');
};

const testStr = `\*jdjdjdfdf*test*dfsdf\*adfasdasdasd*test**test\**sd*`;
const m = testStr
    .match(prepareRegExp('test'))
    .map(m => m.substr(1, m.length-2));

console.log(m);

https://instacode.dev/#Y29uc3QgcHJlcGFyZVJlZ0V4cCA9ICh3b3JkLCBkZWxpbWl0ZXIgPSAnXFwqJykgPT4gewogIGNvbnN0IGVzY2FwZWQgPSAnKFxcXFwuKSonOwogIHJldHVybiBuZXcgUmVnRXhwKFsKICAgIGRlbGltaXRlciwKICAgIGVzY2FwZWQsCiAgICBbLi4ud29yZF0uam9pbihlc2NhcGVkKSwKICAgIGVzY2FwZWQsCiAgICBkZWxpbWl0ZXIKICBdLmpvaW5gYCwgJ2cnKTsKfTsKCmNvbnN0IHRlc3RTdHIgPSBgXFwqamRqZGpkZmRmKnRlc3QqZGZzZGZcXCphZGZhc2Rhc2Rhc2QqdGVzdCoqdGVzdFxcKipzZCpgOwpjb25zdCBtID0gdGVzdFN0cgoJLm1hdGNoKHByZXBhcmVSZWdFeHAoJ3Rlc3QnKSkKCS5tYXAobSA9PiBtLnN1YnN0cigxLCBtLmxlbmd0aC0yKSk7Cgpjb25zb2xlLmxvZyhtKTs=