我想验证用户提供的字符串是否在Groovy中形成了逗号分隔的项目列表(整数,字符串,混合-无关紧要)。两个主要要求是列表不能包含空项目,并且列表中的任何地方都不应有空格。因此示例有效的字符串为:
1,2,3
1,a,https://test
brown,fox,cat
EN,ES,XOO,ksSIj
test
?@)($,one,two
无效的是:
,,,
12,,34
a, b, c
以常规方式做到这一点的最佳方法是什么?我唯一想到的是像[^,]+
这样的正则表达式(尽管此允许空白字符。还有其他可能或正在调整此正则表达式,直到它唯一起作用为止;如果是这样,那么最简单的方法是用正则表达式表达这一点?
答案 0 :(得分:3)
您可能在这里使用的正则表达式是
/^[^\s,]+(?:,[^\s,]+)*$/
请参见regex demo和正则表达式图:
详细信息:
^
-字符串的开头[^\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+)?$