在 JavaScript 中由一个字符而不是连续的字符分割

Posted

技术标签:

【中文标题】在 JavaScript 中由一个字符而不是连续的字符分割【英文标题】:Split by a character in JavaScript but not contiguous ones 【发布时间】:2012-12-22 10:50:03 【问题描述】:

情况如下:

var stringExample = "hello=goodbye==hello";
var parts = stringExample.split("=");

输出:

hello,goodbye,,hello

我需要这个输出:

hello,goodbye==hello

连续/重复的字符必须忽略,只取单个"="进行拆分。

也许是一些正则表达式?

【问题讨论】:

在您想要拆分的=s 周围是否总是有字母数字字符?或者有没有像hello:=!goodbye 这样的东西应该分成hello:!goodbye 【参考方案1】:

@dystroys 的答案很可能就是您要找的答案。但是,如果字母数字以外的任何字符(A-Za-z0-9_)可以围绕“拆分 =”),那么他的解决方案将不起作用。例如,字符串

It's=risqué=to=use =Unicode!=See?

会被拆分成

"It's", "risqué=to", "use Unicode!=See?"

因此,如果您需要避免这种情况,通常会使用后向断言:

result = subject.split(/(?<!=)=(?!=)/);  // but that doesn't work in javascript!

所以即使这个只在单个 =s 上拆分,你也不能使用它,因为 JavaScript 不支持 (?&lt;!...) 后向断言。

幸运的是,您始终可以通过匹配分隔符之间允许的所有内容,将split() 操作转换为全局match() 操作:

result = subject.match(/(?:=2,|[^=])*/g);

会给你

"It's", "risqué", "to", "use ", "Unicode!", "See?"

【讨论】:

+1 我想知道为什么我正在测试的split 的后视功能不起作用。是“在 Javascript 中不起作用!”记录在某处? @dystroy: regular-expressions.info/refflavors.html 是我的首选资源(或 RegexBuddy)。 match 在处理以分隔符开头/结尾的字符串的方式上通常不等同于 split。此外,它可以返回null。转换并非微不足道:-) 至少您需要使用* 而不是+ @Bergi:对,* 是。但我认为现在的结果相当于我上面提到的正则表达式的(虚构的)拆分。【参考方案2】:

可能的解决方案的初步近似可能是:

".*[^=]=[^=].*"

请注意,这只是正则表达式,如果您想将它与 egrep、sed、java 正则表达式或其他任何东西一起使用,请注意是否需要转义。

注意!:这是第一个近似值,可以改进。请注意,例如,此正则表达式不会匹配此字符串 "=" (null - equal - null)。

【讨论】:

你能详细说明在 OP 的情况下应该如何使用这个正则表达式吗? @dystroy precise 不是动词,但看看你的个人资料,我知道你一定会说法语。 @dystroy 我不明白你。 OP是什么意思?如果您要询问如何在程序中/与程序一起使用该正则表达式的示例,让我们看看它。文件内容:hello=world hell0==w0rld bye=cruel==world by3==cru3l=w0rld = == === OP 想要拆分一个字符串。您能否使用您的正则表达式生成所需的 javascript 代码,或者您的答案真的只是一个评论? 好的,现在我意识到我不能在 cmets 中使用代码块 ¬¬。我也花了 5 分钟来更改评论。解释你想问什么,我会回答你的:)【参考方案3】:

您可以使用正则表达式:

var parts = stringExample.split(/\b=\b/);

\b 检查单词边界。

【讨论】:

我认为只有等号应该被忽略,而不是任何非单词字符。 @Bergi 我不确定我是否看到您的问题。你能举个例子吗? hello(=)goodbye 不会拆分为 hello()goodbye 例如 - 我相信这是意料之中的(需要 OP 澄清,请) @Bergi 好的,我明白你的意思了。我认为我们应该为此使用lookbehind。 @dystroy:是的,只是 JS 不支持lookbehind,这就是让任务变得复杂的原因:-)

以上是关于在 JavaScript 中由一个字符而不是连续的字符分割的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode1869. 哪种连续子字符串更长(C++)

Java字符串整理笔记

《LeetCode之每日一题》:38.哪种连续子字符串更长

在 Android Java 中由另一个线程更新 textView

为啥在字符串中使用 javascript 转义字符的引号需要是 \\' 而不是 \'

如何在 C# 中由 .NET WebBrowser 控件托管的页面中调用 JavaScript 方法并将参数传递给 JavaScript 方法? [复制]