Javascript 查找包含分隔符转义形式的子字符串(Regexp) 大家好!

Javascript 查找包含分隔符转义形式的子字符串(Regexp) 大家好!,javascript,regex,Javascript,Regex,我在玩markdown,处理内联标记和转义字符 问题: 我想转换这个:some text*some number\*other number*more text 进入这个:一些文本一些数字*其他数字更多文本 我当前的模式是:/((?!\\)\*)(.*)((?!\\)\*)/g 但是(.*)组似乎捕获了\字符,因此第三组找到第二个*字符,并停止寻找第三个字符,这应该是它的目标 可能的解决办法: 我可以使用反向查找来解决这个问题:/(?),但如果可能的话,我希望避免它 我可以修改我的其他模式使其工

我在玩markdown,处理内联标记和转义字符

问题: 我想转换这个:
some text*some number\*other number*more text

进入这个:
一些文本一些数字*其他数字更多文本

我当前的模式是:
/((?!\\)\*)(.*)((?!\\)\*)/g

但是
(.*)
组似乎捕获了
\
字符,因此第三组找到第二个
*
字符,并停止寻找第三个字符,这应该是它的目标

可能的解决办法: 我可以使用反向查找来解决这个问题:
/(?),但如果可能的话,我希望避免它

我可以修改我的其他模式使其工作吗?

您可以使用此模式

\*(.*)\*
这使用上面的正则表达式来查找到最后一个
*
为止的
*
。然后使用
\\(。
查找转义字符并将其替换为捕获的组

const regex=/\*(.*)\*/gm;
const str=`some text*some number\\\*other number*more text`;
const subst=`$1`;
//被替换的值将包含在结果变量中
const result=str.replace(regex,subst);
const finalResult=result.replace(/\\(.)/,“$1”)//在此处替换转义字符
console.log(finalResult);
您可以使用

var str=“一些文本*一些数字\\*其他数字*更多文本”;
console.log(
str.replace(/((?:^^\\\])(?:\\{2})*)\*([^\\*]*(?:\\[\s\s][^*\\]*)\*/g,
函数($0,$1,$2){return$1+''+$2.replace(/\\([\s\s])/g,$1'+'';}
)

)
使用以下正则表达式可以更简单地完成相同的任务:

\\.|\*((\\.|[^*])+)\*
我们的想法是在所有转义字符被使用后匹配所需的字符串。我们尝试使用交替的第一个方面匹配所有转义字符,然后在第二次尝试时,我们希望匹配所需的模式(如果存在)

JS代码:

var str=`some text*some number\\\*other number*更多文本`
log(str.replace(/\\.\\.\*(\\.[^*])+)\*/g,函数(匹配,$1){
返回$1?“”+$1+“”:匹配;

}))
?@splash58您能将其作为答案发布吗?
/(^ |[^\\])\*(.*)($|[^\\]))\*/g
如果
*
位于字符串的开头。即使您解决了这个问题,您也可以
\*一些数字\*其他数字*更多文本
,因为第一个
\\
定义了反斜杠。@WiktorStribiżew@splash58,
\\\\*一些数字\*其他数字*更多文本
以反斜杠和转义的
开头*
,但有一个匹配项。这种任务不能用
*?
和lookarounds解决。问题是,出于教育目的,我需要这些东西,它比理想的要复杂得多,但谢谢你的详细解释。你能修改它以处理
str
中的子字符串的多个实例吗?@Nekomaj在42中检查更新的一个。让我知道是否丢失了什么更新的模式似乎只找到字符串中的第一个和最后一个
*
标记,并且忽略它们之间的相同标记。此模式似乎与
*
标记外的
\*
子字符串匹配。它匹配但不替换。存在回调对于
replace
方法。即使您接受的答案也会连续两次调用
replace()
,这会使事情变得复杂。如果您遇到任何问题,请给出一个示例。