我在练习regex。我想创建将*转换为<em>的regex,就像使用Markdown一样:
el = el.replace(/\*\b/g, '<em>')
el = el.replace(/\b\*|(\.|\,|\?|\!|\*|---|\.\.\.\s)\*/g, '$1</em>')在大多数情况下,这是可行的。但是,如果将正则表达式应用于此,事情就会变得一团糟:
Chicken teriy*ai*ki, r*ai*men noodles, spaghetti a la moneg*ai*sque.它产生了这样的结果:
Chicken teriy<em>ai<em>ki, r<em>ai<em>men noodles, spaghetti a la moneg<em>ai<em>sque. And wait for me, often falling asleep.</em></em></em></em></em></em>如何修改这个正则表达式,以便生成如下内容:
Chicken teriy<em>ai</em>ki, r<em>ai</em>men noodles, spaghetti a la moneg<em>ai</em>sque. And wait for me, often falling asleep.发布于 2018-10-03 07:03:51
您可以将第二个正则表达式中的两个分支合并,因为这两个分支都以\*模式结束,比如(\b|\.|,|\?|!|\*|---|\.{3}\s)\* (您甚至可以将\.|,|\?|!|\*单字符替代方案合并为[.,?!*]),然后使用
var s = "Chicken teriy*ai*ki, r*ai*men noodles, spaghetti a la moneg*ai*sque.";
console.log(
s.replace(/\*\b([^]*?)(\b|[.,?!*]|---|\.{3}\s)\*/g, '<em>$1$2</em>')
)
详细信息
\*\b -- *后面跟着一个单词字符(字母、数字或_)([^]*?) - Group 1:任何0+字符,尽可能少(如果需要更多的可移植性,可以用[\s\S] / [\d\D] / [\w\W]替换),直到(\b|[.,?!*]|---|\.{3}\s) -单词边界,.,,,?,!,*,---,... +空格\* -a * char.发布于 2018-10-03 06:42:56
发布于 2018-10-03 06:47:20
这应该有效,它将*符号之间的字符包装到em标记中,注意:这适用于所提供的字符串。
const str = "something that has words surrounded with * signs"
str.replace(/\*(\w+)\*/g, "<em>$1</em>")https://stackoverflow.com/questions/52621034
复制相似问题