正则表达式匹配逗号分隔值

时间:2021-03-01 13:56:29

标签: java regex

我是 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"

)开头时,它不起作用

我是否应该以空格分割并为每个子字符串寻找更简单的正则表达式?

3 个答案:

答案 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 次
  • $ 字符串结束

Regex demo

答案 2 :(得分:1)

<块引用>

“由一个或两个以逗号分隔的大写字母列表组成的字符串,由一个空格分隔”

不确定如何完全解释上述内容,但我的理解是:一两个逗号分隔的列表,其中每个列表只能由大写字符组成。在两个列表的情况下,两个列表之间用一个空格分隔。

你可以试试:

^(?!.* .* )[A-Z](?:[ ,][A-Z])*$

查看在线demo

  • ^ - 起始字符串锚点。
  • (?!.* .* ) - 否定前瞻以防止出现两个空格。
  • [A-Z] - 单个大写字母字符。
  • (?: - 打开非捕获组:
    • [ ,] - 逗号或空格。
    • [A-Z] - 单个大写字母字符。
    • )* - 关闭非捕获组并匹配 0 次以上;
  • $ - 结束字符串锚点。