如何获取一个字符串中在两个特定字符之间的子字符串。

3

我想知道如何从一个字符串中提取单词(子字符串),如果这些字符串位于两个特定字符之间。在我的情况下,我希望开始字符是空格,结束字符是逗号,就像这样:

var str = "Hit that thing man! and a one, two, three, four, five, six, seven or eight";

结果:

var result = ["one", "two", "three", "four", "five", "six", "seven", "eight"];

我想知道是否可以用正则表达式实现,或者使用传统的JavaScript可能是一个简单直接的解决方案。
到目前为止,我已经尝试了以下方法:
var result = str.split(/[,\s]+/);

但是无济于事,因为它不能正确执行以下行为:

  1. 抓取one之前的整个字符串。
  2. 抓取所需字母前面的空格。

加分回合: 我能通过在期望的正则表达式/JavaScript解决方案中添加内容来包含最后一个字母eight吗?

非常感谢您的任何帮助!


1
正则表达式绝对是可行的。 - Pointy
1
根据您对所需结果的定义,eight 如何在结果数组中出现? - Tomáš Zato
1
八不是一个字母!它是一个单词! - Onilol
1
好的,我创建了一个正则表达式,可以与你的句子配合使用,并且不像其他一些正则表达式那样在字符串结尾处失败(例如,“one, two, three”匹配所有三个)。 - Tomáš Zato
@Onilol ... plop 真是太对了 - AGE
显示剩余3条评论
3个回答

2
TLDR: regex101.com 为什么不直接获取所有匹配项?这似乎比分割字符串更简单。
var re = /(?:^|\s)([^,\s]+)(?:,|$| or)/g,
    s = "Hit that thing man! and a one, two, three, four, five, six, seven or eight",
    m,
    matches = [];

// Matches once and then as long as there are some matches
do {
    m = re.exec(s);
    if (m) {
        matches.push(m[1]);
    }
} while (m);

console.log(m);

这样会产生:
["one", "two", "three", "four", "five", "six", "seven", "eight"]

如果您不想使用“或”进行匹配,只需将其删除即可:
/(?:^|[\s])([^,\s]+)(?:,|$)/g

你还可以添加“and”,它经常出现在这些列表中,有时代替“or”:
/(?:^|[\s])([^,\s]+)(?:,|$| and| or|)/g
“^”和“$”允许匹配字符串的开头和结尾。

当然,在我的解决方案中,“or”与逗号具有相同的作用。 - Tomáš Zato
@davidkonrad 这个和之前的回答都解决了问题,Tomas 只是以一种多功能的方式解释了他的方法,这不仅仅是一个正则表达式的方式,真正全面地回答了这个问题。 - AGE
1
你不需要在方括号中加入\s,它本身已经是一个字符类,因此[\s]\s相同。 - Aaron
@AaronGOUZIT 我最初想在那里放一些更多的字符,例如(,它们可以与单词连接而不需要空格。 - Tomáš Zato
1
@TomášZato 确定,我只是认为你应该编辑你的答案,这样没有人会认为\s只能在括号中使用。 - Aaron
显示剩余5条评论

1
str.match(/\b[A-z]+(?=(, )|( or )|$)/g)

它会从文本开头匹配一个单词,如果这个单词后面跟着逗号、单词"or"或文本结尾,则匹配成功。
你可以在这里进行尝试。

我注意到在你的regex101链接中,它捕获了八个字符,但当我自己测试时,它没有包含在console.log中,能解释一下为什么吗? - AGE
我确实做了几次以确保,因为你是第一个完全回答问题的人。我授予了另一个人正确的答案,因为他们也完全正确地完成了奖励回合。请随意查看这里,如果我搞砸了,请告诉我,否则你应该得到它:http://jsfiddle.net/AGE/7usjzk3w/ - AGE
@AGE你的str变量不包含“eight”,所以不奇怪它的模式不匹配;) 当我在字符串末尾添加“或eight”时,它就可以工作了。 - Aaron
正如预料的那样,这完全是我的错,我忘记在测试中包括“和八”,一切发生得太快了,现在需要确定谁先回答了它 :) - AGE
1
@AGE 没问题,只要你得到了答案,那就是最重要的部分 ;) - Aaron
显示剩余2条评论

1
最终的or是唯一的实际问题,因为JavaScript不支持后顾。因此,您不能使用单个正则表达式来捕获"两个特定字符之间的单词" - 您总是最终至少得到左边的一个结果。
我想到了这个方法:通过将or替换为逗号并在末尾添加一个逗号,将字符串转换成形式。然后就可以使用简单的正则表达式了:
var result = str.concat(',').replace(' or ',',').match(/\w+(?=,)/g);

它不能与split一起使用,因为这会将整个句子的第一部分分配给one

@AGE:根据我的测试,它应该也可以从您的原始测试字符串中提取“eight”。请注意,“concat”会在末尾添加逗号,正是为了满足条件“\w+(?=,)”。 - Jongware

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