以下是我必须匹配的示例字符串:
var sampleStr = "aaa[bbb=55,zzz=ddd],#ddd[ppp=33,kk=77,rr=fff],tt,ff";
我需要编写匹配所有不在,
[
]
个字符的正则表达式
所以在我的示例字符串中,我应该收到下一个,
字符:
- `,` before `#ddd`
- `,` before `tt`
- `,` before `ff`
它应忽略下一个,
:
- `,` before `zzz`
- `,` before `kk`
- `,` before `rr`
实际上我不知道如何忽略,
内的[...]
。
任何进步的重大举措
答案 0 :(得分:3)
如果您可以认为[]
内的部分不包含嵌套[]
,并且[]
是平衡的:
var out = content.split(/,(?![^\[\]]*\])/);
(?![^\[\]]*\])
是一个负面的预测,用于启发式检查我们不在[]
内。只要我们在]
和[
以外的字符消费时我们不会遇到任何]
,那么我们就在[]
之外。
上面的代码会将文字沿着括号,
之外的逗号[]
拆分并返回令牌。
答案 1 :(得分:1)
避免用方括号括起来的逗号的一种方法是首先匹配方括号。替换示例:
var result = sampleStr.replace(/([^\[,]*(?:\[[^\]]*\][^\[,]*)*),/g, '$1#');
其他示例如果要拆分:
var result = sampleStr.match(/(?=[^,])[^\[,]*(?:\[[^\]]*\][^\[,]*)*/g);
这些方法的优点是你不需要解析所有的字符串,直到最后为每个逗号预测。
答案 2 :(得分:1)
这个正则表达式应该可行
,(?![^\[]*?\])
请参阅:DEMO
<强>解释强>
,
是我们的目标逗号,
(?![^\[]*?\])
使用否定前瞻来保证]
之后没有,
,这里有一个技巧,而不是使用.*
我们使用[^\[]*
来阻止正则表达式匹配模式[...]
而不是..]
。