匹配字符但不包括该字符及其后面的内容

3
在有人说这是重复问题这个之前,我想指出JavaScript没有所谓的“回顾后发现”,因此我一直在苦苦挣扎。如此处所述,它确实具有“向前查看”的功能。
我真正想做的是这样的。我有:
hey:blah,{'some':'obj','another':[4,5,0]} 我想提取冒号后面但不包括第一个冒号。因此我的输出将是:
blah,{'some':'obj','another':[4,5,0]} 到目前为止,我的尝试是:
(:.+) //会得到 :blah,{'some':'obj','another':[4,5,0]} - 注意它有一个冒号
[^\w:].+ //会得到 ,{'some':'obj','another':[4,5,0]} - 不是我期望的结果。缺少blah
我正在尝试纯正则表达式,并试图避免任何循环或字符串操作等。到目前为止,我的尝试没有成功。

使用捕获组。 - Avinash Raj
1
为什么要使用正则表达式来操作一个不太有效的JS对象的字符串表示形式?你打算如何处理由正则表达式产生的更不合法的JS“对象”?请记住,正则表达式本身并没有执行任何操作;它们只是匹配。它们不会“提取”任何内容,只是进行匹配。如果要对该匹配执行任何操作,甚至调用它,您将需要进行JavaScript的“戏法”,即使只是调用String#match。只要你这样做了,为什么在其中加入一个splitreplaceslice会冒犯你的感官呢? - user663031
我不知道为什么你会认为需要循环;其实并不需要。至于“字符串操作”,正则表达式已经是“字符串操作器”,所以你无论如何都在操作字符串。 - user663031
@torazaburo 我知道它们只是匹配,但它不应该能够匹配并返回匹配的字符串吗?此外,请不要考虑有效或无效的JS对象的实现细节。相信我,使用javascript的方法或所谓的“诡计”并不会冒犯我。我只是希望尽可能多地使用正则表达式来完成它。我已经提到过我也愿意接受JavaScript的“诡计”。 - shriek
正则表达式并不会“返回”任何东西。它们存在于语言的上下文中,在该上下文中,它们由一些API调用,例如在JS中的String#matchRegExp.test中,并且这些API可能会返回一个布尔值,表示是否发生了匹配,以及匹配的字符串和捕获组(如果有)。在JS中使用正则表达式将需要使用API。因此,我坚持认为,任何使用正则表达式都涉及使用JS的“诡计”。你说“你愿意接受JS的诡计”,但你的评论“但我正在尝试不使用诡计来完成它”很难协调。 - user663031
3个回答

4

正则表达式

如果您不希望选择任何内容,可以将其包装在前瞻中:

(?=:(.*))

如果你想一直到冒号后面:
(?=:([^:]*))

JavaScript代码

因为没有选择任何内容,[0] 将为空白。访问 [1]:

/(?=:(.*))/.exec("hey:blah,{'some':'obj','another':[4,5,0]}")[1];
//                         Use [1] not [0]                       ^^

这样说,下面的内容是否有问题:

话虽如此,以下内容是否有问题:

var str = "hey:blah,{'some':'obj','another':[4,5,0]}";
str.substr(str.indexOf(':') + 1);

哦,用你的exec解决方案我只得到了"blah,{'some'"。而且indexOf也被接受,但这与@Avinash Raj的答案相同,他使用了JavaScript的方法。我倾向于将其标记为正确答案,但对于@Avinash的解决方案我也是这样。 - shriek

2
你可以使用 string.replace
string.replace(/^[^:]*:/, "");

那是我的第二个选项,是的。但我正在尝试不使用javascript的任何欺骗方式来完成它。 - shriek
如果你想进行匹配,那么除了捕获组之外别无选择。 - Avinash Raj
@AvinashRaj 我不知道为什么更多的人不使用/^.*?:/,在我看来它看起来更干净。 - user663031
由于速度的原因,可以通过单击调试器选项在regex101.com中检查两个正则表达式。 - Avinash Raj
@AvinashRaj 对于正则表达式,我可能有些幼稚,但是你所说的捕获组是指这个吗? @torazaburo “trickery”的意思是,如果有人想在不具备“replace”功能的语言中使用该正则表达式,则应该能够使用。 - shriek
但是如果我找不到其他更好的答案,我会将其标记为正确答案,因为我已经使用了“javascript”标签。 - shriek

2

2
@vks 实际上,只需说/:(.*)/会更简单。冒号将匹配字符串中的第一个冒号。.*将一直匹配到字符串的末尾。 - user663031
@shriek 你需要获取 第一组 而不是匹配结果。 - vks
@shriek vks 是对的。你提供的正则表达式完美地匹配了整个字符串。第一组匹配了 OP 寻找的文本。在 JS 中,这个方法完美地运行。为什么不呢? - user663031
啊,我明白了。这可能是最接近我要找的东西了。如果我理解正确,技术上只需要 :(.*$) 就可以了,但你的方法确认了它必须从开头开始。 - shriek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接