我是 Java 中的 Regex 新手,我想知道如何构建一个只接受一个字符串的字符串,该字符串由一两个逗号分隔的大写字母列表组成,由单个空格分隔。
我需要过滤掉以逗号开头、以逗号结尾的字符串或具有多个连续逗号的字符串。
所有这些都是无效的:
"D,, D"
"D D,,"
"D, ,D"
"D, ,,D"
"D,, ,D"
"D,,"
",,A"
",A"
"A,"
所有这些都是有效的:
"D,D T,F"
"D,D T"
"A,A"
"A"
我使用 (\s?("[\w\s]*"|\d*)\s?(,,|$))
表示连续的逗号,但是当逗号位于末尾或以空格分隔的子字符串之一(如 "D, ,D"
我是否应该以空格分割并为每个子字符串寻找更简单的正则表达式?
答案 0 :(得分:3)
应该是这样的:
^[A-Z](,[A-Z])*( [A-Z](,[A-Z])*)*$
这里发生了什么,如下:
测试:https://regex101.com/r/kzLhtw/1
当然,您可以通过将所有捕获组设为非捕获来稍微优化正则表达式:只需将 ?:
紧跟在 (
后面,即 (?:
。
答案 1 :(得分:2)
你可能会使用
^[A-Z](?: [A-Z])*(?:,[A-Z](?: [A-Z])*){0,2}$
^
字符串开头[A-Z]
匹配单个字符 A-Z(?: [A-Z])*
(可选)重复一个空格和一个字符 A-Z(?:
非捕获组
,[A-Z](?: [A-Z])*
匹配一个逗号,字符 A-Z 后跟可选地重复匹配一个空格和一个字符 A-Z){0,2}
关闭组并重复 0-2 次li>
$
字符串结束答案 2 :(得分:1)
“由一个或两个以逗号分隔的大写字母列表组成的字符串,由一个空格分隔”
不确定如何完全解释上述内容,但我的理解是:一两个逗号分隔的列表,其中每个列表只能由大写字符组成。在两个列表的情况下,两个列表之间用一个空格分隔。
你可以试试:
^(?!.* .* )[A-Z](?:[ ,][A-Z])*$
查看在线demo
^
- 起始字符串锚点。(?!.* .* )
- 否定前瞻以防止出现两个空格。[A-Z]
- 单个大写字母字符。(?:
- 打开非捕获组:
[ ,]
- 逗号或空格。[A-Z]
- 单个大写字母字符。)*
- 关闭非捕获组并匹配 0 次以上;$
- 结束字符串锚点。