检查提供的字符串是否是有效的项目列表

时间:2019-05-08 08:25:15

标签: regex groovy

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

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

无效的是:

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

以常规方式做到这一点的最佳方法是什么?我唯一想到的是像[^,]+这样的正则表达式(尽管此允许空白字符。还有其他可能或正在调整此正则表达式,直到它唯一起作用为止;如果是这样,那么最简单的方法是用正则表达式表达这一点?

3 个答案:

答案 0 :(得分:3)

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

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

请参见regex demo和正则表达式图:

enter image description here

详细信息:

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

在Groovy中使用斜线字符串定义正则表达式,以便对正则表达式转义使用单个反斜杠。

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

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

输出为true,如果末尾添加逗号,则输出为false

请参见this Groovy demo

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

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

答案 1 :(得分:1)

如果您想在没有正则表达式的情况下进行此操作,这可能更容易理解:

boolean isInvalid(String str) {
    def split = str.split(',')
    str.contains(" ") || !split.size() || !split.every{it}
}

如果返回true

  • 输入内容包含空格,或
  • ,上分割会导致数组为空,或者
  • 分裂后的结果列表中并非每个项目都是“真实的”

答案 2 :(得分:-2)

尝试此正则表达式:

^([^,\s]+)(,[^,]\S+)?$