请参阅https://regex101.com/r/463Qpm/1/
在这种情况下,我想匹配Bb和Dd
Aa : Bb, Cc : Dd
但不是在这种情况下,当有{和几个字符
{Aa : Bb, Cc : Dd
我尝试了这个正则表达式,但我有+错误。我找不到正确的语法:
(?<!{[A-Za-z]+)(?<=:s)[A-Za-z][a-z]*
通过对lookbacking的支持进行测试,您尝试的(?<!{[A-Za-z]+)(?<=:s)[A-Za-z][a-z]*
模式在这两种情况下都匹配,因为在Bb
和Dd
之前的位置上两个断言都为true。
直接左边有:s
,而直接左边没有{[A-Za-z]+
,因为不可能两者都有,因此断言为真。
请注意,有关Javascript中lookbacking的支持,请参阅此页面。
一个不使用环视的选项可以是使用带有交替的捕获组,首先排除您不想要的内容。然后把你想保留的东西放在一个小组里。
{[A-Za-z].*|:s([A-Za-z][a-z]*)
图案与匹配
{[A-Za-z].*
匹配{
,一个字符a-Za-z和行的其余部分|
或:s
匹配:
和一个空白字符([A-Za-z][a-z]*)
捕获组1,匹配一个字符a-Za-z,后跟可选字符a-z
Regex演示
const regex = /{[A-Za-z].*|:s([A-Za-z][a-z]*)/g;
[
'Aa : Bb, Cc : Dd',
'{Aa : Bb, Cc : Dd'
].forEach(str => {
const result = Array.from(str.matchAll(regex), m => m[1]);
if (result[0] !== undefined) {
console.log(result);
}
})
使用单个查找的另一个选项可以是断言从字符串开始的左边没有{
,然后断言:s
(?<=^[^{]*:s)[A-Za-z][a-z]*
Regex演示
const regex = /(?<=^[^{]*:s)[A-Za-z][a-z]*/g;
[
'Aa : Bb, Cc : Dd',
'{Aa : Bb, Cc : Dd'
].forEach(str => {
const result = str.match(regex);
if (result) {
console.log(result)
}
})