我有正则表达式的简单问题,但我不知道解决它们。我有字符串(灰色这是一个标签):
cccc
:dddddbbbb
:fggggaaa aa
:ddd dddcccc
:ggggggg
和正则表达式
/(aaa aa|bbbb|cccc)+:([\sa-zA-Z]*)(?:$|\s)/ig
https://regex101.com/r/mR3vK5/1
解析字符串'label'aaa aa
后忽略,因为有空格并被带到第二个匹配。我希望在插入第二个匹配到下一个“标签”或结束行之后先做匹配标签(带或不带空格),冒号和任何东西(带空格)。
有什么建议吗?
答案 0 :(得分:3)
如果您知道所有键,您可以在正向前瞻中使用它们,并将值与延迟点匹配:
/(aaa aa|bbbb|cccc):(.*?)(?=$|\s+(?:aaa aa|bbbb|cccc))/gi
参见JS演示:
var block = "aaa aa|bbbb|cccc";
var rx = RegExp("(" + block + "):(.*?)(?=$|\\s+(?:" + block + "))", "ig");
var s = "cccc:ddddd bbbb:fgggg aaa aa:ddd ddd cccc:ggggggg";
while ((m = rx.exec(s)) !== null) {
document.body.innerHTML += m[1] + ": " + m[2] + "<br/>";
}
模式说明:
(aaa aa|bbbb|cccc)
- aaa aa
或bbbb
或cccc
:
- 字面冒号(.*?)
- 第2组匹配0 +除换行之外的任何字符尽可能少到第一个...... (?=$|\s+(?:aaa aa|bbbb|cccc))
- (限制.*?
匹配的正向前瞻)
$
- ...字符串结尾|
- 或...... \s+
- 一个或多个空格后跟......
(?:aaa aa|bbbb|cccc)
- 三种替代方案中的任何一种(在非捕获组中,仅用于分组,不捕获)答案 1 :(得分:0)
那么这将做你想做的事情
/(aaa aa|bbbb|cccc)+:(\s*[a-zA-Z]*)(?:$|\s)/ig
但是,考虑到这个问题,它是非常人为的。
答案 2 :(得分:0)
如果您只是想获得标签(即使密钥有空格),请按以下方式快速输入:https://regex101.com/r/jJ9iI1/3
(?:^|\s)([^:]+):
它以^
或\s
(开头或空格字符)开头。然后它只是捕获每个字符(除了冒号),直到结肠。
...确保全局g
已开启