首页 > 解决方案 > 想要一个正则表达式,它将验证 java 变量之间只有一个逗号

问题描述

我有一个用于验证字符串的正则表达式。

String s = SELECT column1,column2 GROUPBY column3 AS AliasName
regex = ^SELECT\s+[[a-zA-Z_$][a-zA-Z_$0-9]*,*]+[a-zA-Z_$][a-zA-Z_$0-9]?\s+GROUPBY\s+[[a-zA-Z_$][a-zA-Z_$0-9]*,*]+[a-zA-Z_$][a-zA-Z_$0-9]?\s+AS\s+[a-zA-Z_$][a-zA-Z_$0-9]*$

此验证有效,但我需要更改正则表达式的帮助,因此它只允许在每个 Java 变量之间使用一个逗号,并且不允许在第一列之前使用逗号。

例如,以下字符串不应该匹配,但它确实匹配:

String s2 = SELECT ,column1,,column2 GROUPBY column3 AS AliasName

另外,我想更改它,以便SELECT,GROUPBYAS可以是大写或小写。我知道我可以使用另一种方式|,但我更喜欢不同的方式。

标签: javaregexvalidationpattern-matching

解决方案


试试这样:

(?i)^SELECT ([a-zA-Z_$][a-zA-Z_$0-9]+,)*([a-zA-Z_$][a-zA-Z_$0-9]+) (?:(GROUPBY) ([a-zA-Z_$][a-zA-Z_$0-9]+,)*([a-zA-Z_$][a-zA-Z_$0-9]+))?(?: AS ([a-zA-Z_$][a-zA-Z_$0-9]+))?

在线演示
代码示例

允许小写的最简单方法是使用 inline 修饰符将正则表达式切换为不区分大小写(?i)

PS:您的查询看起来不完整。没有FROM部分?PPS:您可能需要研究不同的解决方案,因为正则表达式无法完全匹配和验证 SQL 语法。您可以尝试对查询进行标记。或者,更好的是,改用解析器。ANTLR 有一些SQL 语法


推荐阅读