首页 > 解决方案 > 检查提供的字符串是否是有效的项目列表

问题描述

我想验证用户提供的字符串是否在 Groovy 中形成逗号分隔项(整数、字符串、混合 - 无关紧要)的列表。两个主要要求是列表不能包含空项,并且列表中的任何地方都不应有空格。所以样本有效字符串将是:

1,2,3
1,a,https://test
brown,fox,cat
EN,ES,XOO,ksSIj
test
?@)($,one,two

虽然无效是这样的:

,,,
12,,34
a, b, c

在 groovy 中执行此操作的最佳方法是什么?我想到的唯一想法是正则表达式[^,]+(尽管这个允许空格字符。任何其他可能性或正在调整这个正则表达式,直到它以唯一的方式工作 - 如果是这样,用正则表达式表达这一点的最简单的方法是什么?

标签: regexgroovy

解决方案


您可以在这里使用的正则表达式是

/^[^\s,]+(?:,[^\s,]+)*$/

请参阅正则表达式演示和正则表达式图:

在此处输入图像描述

详细地:

  • ^- 字符串的开始
  • [^\s,]+- 除空格和逗号之外的 1+ 个字符
  • (?:,[^\s,]+)*- 0次或多次重复
    • ,- 逗号
    • [^\s,]+- 除空格和逗号之外的 1+ 个字符
  • $- 字符串结束。

在 Groovy 中使用斜杠字符串来定义正则表达式,以便将单个反斜杠与正则表达式转义一起使用。

此外,如果您使用==~运算符,您甚至不需要^$锚点,因为==~正则表达式匹配运算符需要在 Groovy 中进行完整的字符串匹配:

def s = '1,a,https://test'
def regex = /[^\s,]+(?:,[^\s,]+)*/
print s ==~ regex

输出为true,或者false如果您在末尾添加逗号。

请参阅此 Groovy 演示

如果必须使用=~运算符,请保留锚点:

def regex = /^[^\s,]+(?:,[^\s,]+)*$/
print s =~ regex

推荐阅读