3

我在 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(单字混合型,无空格)INTEGER2(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,但无法完全得到我需要的东西,最终手动划界。但我确信这是可以做到的,尽管有人有更大的大脑。有很多正则表达式的例子,但我找不到任何处理短语的例子;所以我想知道是否有人可以帮助我。谢谢你。

4

2 回答 2

3

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

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

基本上,它由五个不同的部分组成,每个部分都旨在与您的描述相匹配:

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

注意事项:

  1. 我已经锚定了匹配,以确保它只考虑使用^(主题开始)和$(主题结束)的完整字符串。
  2. 在 regex delimiters 之后/.../,我添加了一个标志来改变 regex 引擎的行为方式。-i标志使匹配不区分大小写。
  3. 需要注意的是,当前的正则表达式不会匹配像“it's”这样的收缩。您将需要修改正则表达式组 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-fiddle 演示在这里

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

于 2012-09-07T09:31:17.050 回答
3

尝试以下操作:

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"

演示

于 2012-09-07T09:17:01.770 回答