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

How do I split a string consisting of multiple parts of using regular expressions in JavaScript?

本文关键字:正则表达式 字符串 部分组 何分割 分割 JavaScript      更新时间:2023-09-26

我在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或两位数)PHRASE2(带空格混合型)WORD1(单字混合型,无空格)INTEGER 2(1或二位数)

所以我应该得到:

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有很多例子,但我找不到任何一个来处理短语;所以我想知道是否有人能帮我。非常感谢。

以下是一个适用于示例字符串的正则表达式的尝试:

/^'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或两位数字。也可以写成[0-9]
  3. ''b((?:[a-z]+?)+)''b=与nr 1相同
  4. (''b[a-z]+''b)=匹配由a-z组成的单个单词
  5. (''d{1,2})=与nr 2相同

需要注意的事项:

  1. 我已经锚定了匹配,以确保它只考虑使用^(主题开始)和$(主题结束)的完整字符串
  2. 在正则表达式分隔符/.../之后,我添加了一个标志,它改变了正则表达式引擎的行为方式。i-标志使匹配大小写不敏感
  3. 需要注意的是,像"it’s"这样的缩写不会与当前正则表达式匹配。您需要修改regex组1和3以适应这种情况
  4. 这些组由一个空格分隔。如果这可能有所不同,那么您需要修改组分隔符

您可以按如下方式使用它:

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小提琴演示在这里

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

尝试以下操作:

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"

演示