如何在JavaScript中拆分由使用正则表达式的多个部分组成的字符串?

时间:2012-09-07 09:12:07

标签: javascript regex

在JavaScript中遇到正则表达式问题。我有很多字符串需要用逗号分隔。不幸的是,子字符串周围没有引号,这会使生活更轻松。

var str1 = "Three Blind Mice 13 Agents of Cheese Super 18"
var str2 = "An Old Woman Who Lived in a Shoe 7 Pixies None 12"
var str3 = "The Cow Jumped Over The Moon 21 Crazy Cow Tales Wonderful 9"

它们的形式为PHRASE1(带空格的混合类型)INTEGER1(1或2位)PHRASE2(带空格的混合类型)WORD1(单字混合类型,无空格)INTEGER2(1或2位数)< / p>

所以我应该得到:

result1 = "Three Blind Mice,13,Agents of Cheese,Super,18"
result2 = "An Old Woman Who Lived in a Shoe,7,Pixies,None,12"
result3 = "A Cow Jumped Over The Moon,21, Crazy Cow Tales,Wonderful,9"

我看过txt2re.com,但不能完全得到我需要的东西,最后手工分隔。但我确信它可以做到,尽管有一个更大脑的人。 regEx有很多例子,但我找不到任何处理短语的例子;所以我想知道是否有人可以帮助我。谢谢。

2 个答案:

答案 0 :(得分:2)

尝试以下方法:

var s = "Three Blind Mice 13 Agents of Cheese Super 18";
s.replace(/([^\d]+) (\d{1,2}) ([^\d]+) ([A-Z][a-z]+) (\d{1,2})/, '$1, $2, $3, $4, $5')
// "Three Blind Mice, 13, Agents of Cheese, Super, 18"

<强> DEMO

答案 1 :(得分:2)

这是尝试使用适用于示例字符串的正则表达式:

/^\b((?:[a-z]+ ?)+)\b (\d{1,2}) \b((?:[a-z]+ ?)+)\b (\b[a-z]+\b) (\d{1,2})$/i

基本上,它由五个不同的部分组成,每个部分都符合您的描述:

  1. \ b((?:[a-z] +?)+)\ b = 匹配由a-z组成的单词,可选地后跟空格。然后我们尽可能多地量化它(i-flag使搜索不区分大小写)
  2. (\ d {1,2}) = 匹配1位或2位数字。也可以写成[0-9]。
  3. \ b((?:[a-z] +?)+)\ b = 与nr 1相同。
  4. (\ b [a-z] + \ b) = 匹配由a-z组成的单个词
  5. (\ d {1,2}) = 与nr 2相同。
  6. 注意事项:

    1. 我已锚定匹配项以确保仅使用^(主题开头)和$(主题结束)来考虑完整字符串。
    2. 在正则表达式分隔符/.../之后,我添加了一个标志,它改变了正则表达式引擎的行为方式。 i - 标志使得匹配不区分大小。
    3. 需要注意的是,像“它”这样的收缩将不会与当前的正则表达式相匹配。您需要修改正则表达式组1和3才能适应这种情况。
    4. 这些组由一个空格分隔。如果这可能会有所不同,那么您需要修改组分隔符。
    5. 您可以按如下方式使用它:

      var regex = /^\b((?:[a-z]+ ?)+)\b (\d{1,2}) \b((?:[a-z]+ ?)+)\b (\b[a-z]+\b) (\d{1,2})$/i;
      var s = "The Cow Jumped Over The Moon 21 Crazy Cow Tales Wonderful 9";
      s = s.replace(regex, '$1, $2, $3, $4, $5');
      

      JS-fiddle demo here

      编辑:我已更新演示以创建名为resultCollection的变量来保存已处理的结果。它是一个对象,由每个原始字符串组成,并将处理后的结果字符串作为值。