使用正则表达式匹配多个逗号分隔的单词
Using regex to match multiple comma separated words
我正在尝试找到合适的正则表达式模式,使我能够挑选出以逗号开头或结尾的整个单词,但不包括数字。我想出了 ([\w]+,)
匹配第一个单词后跟一个逗号,所以像这样:
红,1,黄,4
red, 会匹配,但我正在尝试找到一个匹配的解决方案,如下所示:
红色, 1 ,黄色, 4
我还没有找到任何可以像这样破坏字符串的东西,但希望你能帮上忙!
这个正则表达式
,?[a-zA-Z][a-zA-Z0-9]*,?
匹配 'words' 可选择用逗号括起来。逗号和 'word' 之间不允许有空格,单词必须以字母数字开头。
有关演示,请参阅 here。
要确定至少匹配了一个逗号,请使用交替语法:
(,[a-zA-Z][a-zA-Z0-9]*|[a-zA-Z][a-zA-Z0-9]*,)
遗憾的是,据我所知,没有正则表达式引擎支持级联匹配。但是,由于您通常在编程环境的上下文中使用 regexen,因此您可以重复匹配 regex 并将匹配的子字符串用于进一步的匹配。这可以通过使用特殊分隔符(必须保证不会出现在测试字符串中)的链接或迭代函数调用来实现。
示例 (Javascript):
"red, 1 ,yellow, 4, red1, 1yellow yellow"
.replace(/(,?[a-zA-Z][a-zA-Z0-9]*,?)/g, "<>")
.replace(/<[^,>]+>/g, "")
.replace(/>[^>]+(<|$)/g, "> ")
.replace(/^[^<]+</g, "<")
在此示例中,首先测试(简单)正则表达式。调用 returns 由尖括号分隔的初步匹配序列。不包含所需子字符串的匹配项(在本例中为 ,
)将被消除,所有中间的 material.
也将被消除
此技术生成的代码可能比复杂的正则表达式更易于维护。
但是,根据经验,如果您的正则表达式变得太复杂而难以维护,那么一个很好的猜测是,它一开始就不是正确的工具(许多引擎提供 x
匹配修饰符,允许您随意穿插空格 - 即换行符和空格 - 以及评论)。
你表达的问题是:
- \w
解析为:[a-zA-Z0-9_]
。这包括您不需要的数字数据。
- 你在末尾有逗号,这将匹配 foo,
但不匹配 ,foo
.
要解决此问题,您可以这样做:(,\s*[a-z]+)|([a-z]+\s*,)
。提供了一个示例 here.
我正在尝试找到合适的正则表达式模式,使我能够挑选出以逗号开头或结尾的整个单词,但不包括数字。我想出了 ([\w]+,)
匹配第一个单词后跟一个逗号,所以像这样:
红,1,黄,4
red, 会匹配,但我正在尝试找到一个匹配的解决方案,如下所示:
红色, 1 ,黄色, 4
我还没有找到任何可以像这样破坏字符串的东西,但希望你能帮上忙!
这个正则表达式
,?[a-zA-Z][a-zA-Z0-9]*,?
匹配 'words' 可选择用逗号括起来。逗号和 'word' 之间不允许有空格,单词必须以字母数字开头。
有关演示,请参阅 here。
要确定至少匹配了一个逗号,请使用交替语法:
(,[a-zA-Z][a-zA-Z0-9]*|[a-zA-Z][a-zA-Z0-9]*,)
遗憾的是,据我所知,没有正则表达式引擎支持级联匹配。但是,由于您通常在编程环境的上下文中使用 regexen,因此您可以重复匹配 regex 并将匹配的子字符串用于进一步的匹配。这可以通过使用特殊分隔符(必须保证不会出现在测试字符串中)的链接或迭代函数调用来实现。
示例 (Javascript):
"red, 1 ,yellow, 4, red1, 1yellow yellow"
.replace(/(,?[a-zA-Z][a-zA-Z0-9]*,?)/g, "<>")
.replace(/<[^,>]+>/g, "")
.replace(/>[^>]+(<|$)/g, "> ")
.replace(/^[^<]+</g, "<")
在此示例中,首先测试(简单)正则表达式。调用 returns 由尖括号分隔的初步匹配序列。不包含所需子字符串的匹配项(在本例中为 ,
)将被消除,所有中间的 material.
此技术生成的代码可能比复杂的正则表达式更易于维护。
但是,根据经验,如果您的正则表达式变得太复杂而难以维护,那么一个很好的猜测是,它一开始就不是正确的工具(许多引擎提供 x
匹配修饰符,允许您随意穿插空格 - 即换行符和空格 - 以及评论)。
你表达的问题是:
- \w
解析为:[a-zA-Z0-9_]
。这包括您不需要的数字数据。
- 你在末尾有逗号,这将匹配 foo,
但不匹配 ,foo
.
要解决此问题,您可以这样做:(,\s*[a-z]+)|([a-z]+\s*,)
。提供了一个示例 here.