JavaScript正则表达式 - 忽略两个字符之间的某些字符

5
我需要在空格字符 (' ') 上分割一个字符串,但是同时排除任何位于 2 个特定字符之间的空格(比如单引号)。
以下是一个示例字符串:

This-is-first-token This-is-second-token 'This is third token'

输出的数组应该像这样:
[0] = This-is-first-token
[1] = This-is-second-token
[2] = 'This is third token'

问题:是否可以使用正则表达式优雅地完成这个任务?


我不确定这是否优雅,但是/[a-zA-Z-]+|['"][\sa-zA-Z-]+['"]/g - Deck
@Deck。哇,你能解释一下这是干嘛的吗?我正在看一个作弊表(来自Regexlib点com),但我还是搞不懂。 - AlvinfromDiaspar
我认为,一个复杂的正则表达式如果不是专家级别的人才能理解其含义,那么它并不算是一种“优雅”的解决方案。我不确定你在问题中所说的“优雅”是什么意思,因为这有点因人而异,但请记住,一个复杂的单行代码并不总是解决问题的最佳方式。 - jfriend00
嗯,正则表达式作为一种标准工具,在我看来非常优雅(即使我个人无法阅读它)。此外,任何一行代码相比于一个效率相对较低的函数来说,都更加优雅。 - AlvinfromDiaspar
3个回答

12

简短回答:

用于此目的的简单正则表达式如下:

/'[^']+'|[^\s]+/g

示例代码:

data = "This-is-first-token This-is-second-token 'This is third token'";
data.match(/'[^']+'|[^\s]+/g);

结果:

["This-is-first-token", "This-is-second-token", "'This is third token'"]

说明:

正则表达式可视化

Debuggex演示

我认为这只用正则表达式已经尽可能简单了。

末尾的g将其变为全局匹配模式,因此您可以得到所有三个匹配项。如果没有它,则只能得到第一个字符串。

\s匹配所有空格(基本上是空格和制表符,在此例中)。因此,即使在This-is-first-tokenThis-is-second-token之间有一个制表符,它也可以工作。

要匹配大括号中的内容,请使用以下内容:

data.match(/\{[^\}]+\}|[^\s]+/g);

正则表达式可视化

Debuggex演示

大括号或单引号:

data.match(/\{[^\}]+\}|'[^']+'|[^\s]+/g);

正则表达式可视化

Debuggex演示


1
不要认为你需要括号。 - jfriend00
2
我会使用[^\s]+而不是[^ ]+ - hwnd
我正在尝试在regexlib的retester.aspx中进行测试。 - AlvinfromDiaspar
我正在使用RegexLib的正则表达式测试工具。当我添加/g时,我只得到第三个令牌字符串。如果我排除它,则会得到所有3个。 - AlvinfromDiaspar
为什么要使用 [^\s] 而不是 [^ ] ? - AlvinfromDiaspar
显示剩余4条评论

3

您可以使用此分割符:

var string = "This-is-first-token This-is-second-token 'This is third token'";
var arr = string.split(/(?=(?:(?:[^']*'){2})*[^']*$)\s+/);
//=> ["This-is-first-token", "This-is-second-token", "'This is third token'"]

这个假设是所有引号都是平衡的。


1
@jfriend00:从未声称过优雅,但要求需要这种正则表达式。 - anubhava
OP要求一个优雅的解决方案。 - jfriend00
1
再次强调,优雅是一种非常主观的事情。不同的程序员可能会声称不同的东西是优雅的。 - anubhava
3
不要把优美与易读混淆。虽然对我来说,这个正则表达式有点难懂,但它仍然比一个充满字符串操作的函数更加优雅。 - AlvinfromDiaspar

1
我想出了以下内容:
"This-is-first-token This-is-second-token 'This is third token'".match(/('[A-Za-z\s^-]+'|[A-Za-z\-]+)/g)
["This-is-first-token", "This-is-second-token", "'This is third token'"]

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