【问题标题】:How to get substring(s) of a string if said substring(s) are between two specific characters如果所述子字符串在两个特定字符之间,如何获取字符串的子字符串
【发布时间】:2015-10-16 14:29:55
【问题描述】:

我想知道如何从字符串中提取单词(子字符串),如果所述字符串在两个特定字符之间。就我而言,我正在寻找起始字符为空格,最后一个字符为逗号,如下所示:

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 吗?

非常感谢任何帮助!

【问题讨论】:

  • 正则表达式绝对可以。
  • 您在文本中只使用拉丁字符吗?
  • Anjd 如何根据您对所需内容的定义,eight 是否以结果数组结尾?
  • 八不是字母!这是一个词!
  • 好吧,我创建了一个适用于您的句子的正则表达式,并且与其他一些表达式不同,它不会在字符串结尾失败(例如,"one, two, three" 匹配所有三个)。

标签: javascript regex string


【解决方案1】:

TLDR:regex101.com

为什么不只是get all matches?这似乎比拆分东西简单。

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"]

如果您想匹配 or,只需将其删除:

/(?:^|[\s])([^,\s]+)(?:,|$)/g

您还可以添加and,它经常出现在此类列表中,而不是或在此类列表中:

/(?:^|[\s])([^,\s]+)(?:,|$| and| or|)/g

^$ 允许匹配字符串的开头和结尾。

【讨论】:

  • 您的正则表达式包含逗号,编辑它以不将它们包含在结果中,很好的答案仅供参考
  • 我的正则表达式在匹配项中不包含逗号。只需运行代码,不要像我是你的员工一样称呼我“*Edit it ...”。
  • 如果你使用Hit that or TEST thing man! and a one, two, three, four, five, six, seven or eight,那么that也会被选中...? regex101.com/r/cT2pQ9/2
  • 你不需要把\s放在括号里,它本身已经是一个字符类,所以[\s]\s是一样的
  • @TomášZato 当然,我只是认为你应该编辑你的答案,所以没有人认为 \s 只能用在括号中。
【解决方案2】:
str.match(/\b[A-z]+(?=(, )|( or )|$)/g)

如果该单词后跟逗号、单词“or”或文本结尾,则它从开头匹配单词。

你可以try it here

【讨论】:

  • 我注意到在您的 regex101 链接上,它捕获了八个,但是当我自己测试它时,它没有将它包含在 console.log 中,请解释一下原因?
  • @AGE 这很奇怪,当我在 Chrome 下的控制台中测试它时它可以工作。你确定八位在弦的末端吗?这是在我的正则表达式中匹配它的标准
  • 我实际上做了几次以真正确定,因为你第一个完全涵盖了问题的答案。我给了别人正确的答案,因为他们也得到了 100% 正确的奖金回合。随意看这里让我知道我是否搞砸了,否则你应得的:jsfiddle.net/AGE/7usjzk3w
  • @AGE 您的 str 变量不包含“八”,所以难怪模式与它不匹配;)当我在字符串末尾添加“或八”时它可以工作。
  • @AGE 没问题,只要你被回答,就是重要的部分;)
【解决方案3】:

最后的or 是唯一的实际问题,因为JavaScript 不支持lookbehinds。出于这个原因,您不能使用单个正则表达式来捕获“两个特定字符之间”的单词 - 您的结果中总是至少有左边的单词。

我想出了这个:通过用逗号替换or 并在末尾添加一个来将字符串转换为形式。然后是一个简单的正则表达式:

var result = str.concat(',').replace(' or ',',').match(/\w+(?=,)/g);

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

【讨论】:

  • @AGE:根据我的测试,它还应该从原始测试字符串中提取eight。请注意 concat 在末尾添加一个逗号,正是为了这个目的,所以如果满足条件 \w+(?=,)
猜你喜欢
  • 1970-01-01
  • 2012-09-16
  • 2013-09-12
  • 2019-12-02
  • 2011-08-07
  • 2020-09-22
相关资源
最近更新 更多