我正在练习正则表达式。我考虑过创建正则表达式,将*
变成<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.
答案 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)
答案 2 :(得分:1)
这应该起作用,它将*符号之间的字符包装到em标记中,注意:这全局适用于提供的字符串。
const str = "something that has words surrounded with * signs"
str.replace(/\*(\w+)\*/g, "<em>$1</em>")