使用正则表达式匹配多个逗号分隔的单词

时间:2016-06-10 11:20:22

标签: regex string numbers match comma

我正在尝试找到合适的正则表达式模式,这种模式允许我从逗号开始或以逗号结尾来挑出整个单词,但是省略数字。我想出了([\w]+,) ,它匹配第一个单词后面跟一个逗号,所以类似于:

红,1,黄色,4

红色,会匹配,但我正在尝试找到与以下内容匹配的解决方案:

红色, 1 ,黄色, 4

我一直无法找到任何可以像这样破坏的东西,但希望你能够提供帮助!

2 个答案:

答案 0 :(得分:1)

这个正则表达式

,?[a-zA-Z][a-zA-Z0-9]*,?

匹配'单词'可选地用逗号括起来。逗号和“单词”之间不允许有空格,单词必须以字母数字开头。

请参阅here了解演示。

要确定至少有一个逗号匹配,请使用交替语法:

(,[a-zA-Z][a-zA-Z0-9]*|[a-zA-Z][a-zA-Z0-9]*,)

不幸的是,我所知道的没有正则表达式引擎支持级联匹配。但是,由于您通常在编程环境的上下文中使用regexen,因此可以重复匹配正则表达式并将匹配的子字符串用于进一步匹配。这可以通过使用特殊分隔符字符串链接或迭代函数调用来实现(必须保证不会出现在测试字符串中)。

示例(Javascript):

"red, 1 ,yellow, 4, red1, 1yellow yellow"
    .replace(/(,?[a-zA-Z][a-zA-Z0-9]*,?)/g, "<$1>")
        .replace(/<[^,>]+>/g, "")
            .replace(/>[^>]+(<|$)/g, "> $1")
                 .replace(/^[^<]+</g, "<")

在此示例中,首先测试(简单)正则表达式。该调用返回由尖括号分隔的一系列初步匹配。不包含所需子字符串的匹配(在这种情况下为,),所有干预材料都将被删除。

这种技术可能会生成比复杂的正则表达式更容易维护的代码。

然而,根据经验,如果你的正则表达式太复杂而不易维护,那么一个很好的猜测是它首先不是正确的工具(许多引擎提供x匹配修饰符,允许你散布空格 - 即换行符和空格 - 以及随意的评论。)

答案 1 :(得分:1)

你的表达问题是:   - \w解析为:[a-zA-Z0-9_]。这包括您不想要的数字数据。   - 您最后有逗号,这将与foo,匹配,但不会与,foo匹配。

要解决此问题,您可以执行以下操作:(,\s*[a-z]+)|([a-z]+\s*,)。有一个例子here