我正在尝试将正则表达式与javascript一起使用,我有以下列表:
word1 @ ['id1','name1'] @@ ['id2','name2'] @ @ ['id3','name3'] @ word2 @ ['id4','name4'] @ word3 @ ['id5','name5'] @
我想检测所有事物:@ ['.....'] @并像这样拆分它们:
word1
@['id1', 'name1']@
@['id2', 'name2']@
@['id3', 'name3']@
word2
@['id4', 'name4']@
word3
@['id5', 'name5']@
所以我以后可以阅读ID和名称,以便创建链接:
<a href="url/[id]">[name]</a>
我尝试过此正则表达式:
[@\['](.)*['\]@]
但这只是标记从第一个@ ['到名称5末尾的所有内容。
简单代码:
const reg = /[@\['](.)*['\]@]]/;
const arr = content.split(reg);
如果有人知道如何拆分它,我将不胜感激分享解决方案。 谢谢!
答案 0 :(得分:4)
考虑使用split
代替.match
,这可能使逻辑更容易:匹配单词字符,或匹配@[
,后跟任意字符,后跟]@
:
\w+|@\[.*?\]@
const input = `word1 @['id1', 'name1']@ @['id2', 'name2']@ @['id3', 'name3']@ word2 @['id4', 'name4']@ word3 @['id5', 'name5']@`;
console.log(input.match(/\w+|@\[.*?\]@/g));
如果[]
的内部可能包含]@
,而您不想匹配,例如@['id1', ']@', 'name1']@
,那么您将需要更多的逻辑-{ {1}},重复使用[]
或'
分隔的字符串组:
"
答案 1 :(得分:1)
您可以使用
来分割字符串s.split(/\s*(@\[.*?]@)\s*/).filter(Boolean)
请参阅JS演示
var s = "word1 @['id1', 'name1']@ @['id2', 'name2']@ @['id3', 'name3']@ word2 @['id4', 'name4']@ word3 @['id5', 'name5']@";
console.log(s.split(/\s*(@\[.*?]@)\s*/).filter(Boolean));
模式匹配0+个空格,然后捕获@[
,除换行符以外的任何0+字符,并尽可能少地捕获到第一个]@
,然后匹配而不捕获0+空格。捕获的子字符串落在结果数组中,.filter(Boolean)
删除空项目。