如何修复此正则表达式,使其能正确替换*(单词之间)?

时间:2018-10-03 06:36:15

标签: javascript regex markdown

我正在练习正则表达式。我考虑过创建正则表达式,将*变成<em>,就像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.

3 个答案:

答案 0 :(得分:2)

您可以合并第二个正则表达式中的两个分支,因为它们都以\*模式结尾,例如(\b|\.|,|\?|!|\*|---|\.{3}\s)\*(您甚至可以将\.|,|\?|!|\*个单个char替代合并到[.,?!*]中),然后使用

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-一个*,后跟一个字符char(字母,数字或_
  • ([^]*?)-第1组:任意0个以上的字符,并尽可能少(如果需要更多的可移植性,则可以用[\s\S] / [\d\D] / [\w\W]代替) ,直到出现在最左边的
  • (\b|[.,?!*]|---|\.{3}\s)-单词边界,.,?!*---,{{ 1}} +空格
  • ...-一个\*字符。

答案 1 :(得分:1)

使用正则表达式\*([\w ^?.]*?)\*

替换为<em>$1<\em>

el = el.replace(/\*([\w ^?.]*?)\*/g, '<em>$1<\em>')

Regex

答案 2 :(得分:1)

这应该起作用,它将*符号之间的字符包装到em标记中,注意:这全局适用于提供的字符串。

 const str = "something that has words surrounded with * signs"
 str.replace(/\*(\w+)\*/g, "<em>$1</em>")