这个正则表达式
,?[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)。