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);
我正在寻找没有 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);