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

Posted

技术标签:

【中文标题】使用正则表达式匹配多个逗号分隔的单词【英文标题】:Using regex to match multiple comma separated words 【发布时间】:2016-06-10 11:20:21 【问题描述】:

我正在尝试找到合适的正则表达式模式,让我能够挑选出以逗号开头或结尾的整个单词,但忽略数字。我想出了([\w]+,) ,它匹配第一个单词后跟一个逗号,所以类似于:

红色,1,黄色,4

red, 会匹配,但我正在尝试找到一个匹配的解决方案,如下所示:

红色, 1 ,黄色, 4

我还没有找到任何可以像这样破坏字符串的方法,但希望您能提供帮助!

【问题讨论】:

【参考方案1】:

这个正则表达式

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

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

请参阅here 以获取演示。

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

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

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

示例(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 匹配修饰符允许您随意穿插空白 - 即换行符和空格 - 以及 cmets)。

【讨论】:

【参考方案2】:

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

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

【讨论】:

以上是关于使用正则表达式匹配多个逗号分隔的单词的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式匹配两个或多个逗号分隔的整数

正则表达式查找单词的最佳匹配子集

需要 c# 正则表达式将逗号列表中的任何单词与另一个字符串中的任何单词匹配

如何使正则表达式在每个单词之间强制使用逗号?

C# 正则表达式匹配具有分隔符的字符串

正则表达式匹配逗号分隔的数字与可选的小数部分