【问题标题】:Regex to match comma separated values正则表达式匹配逗号分隔值
【发布时间】:2021-05-31 01:18:11
【问题描述】:

我是 Java 正则表达式的新手,我想知道如何构建一个只接受一个字符串的字符串,该字符串由一个或两个逗号分隔的大写字母列表组成,由一个空格分隔。

我需要过滤掉以逗号开头、以逗号结尾的字符串或具有多个连续逗号的字符串。

所有这些都是无效的:

  • "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" 这样的空格分隔子字符串之一的开头时,它不起作用

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

【问题讨论】:

  • reject if this ^\s*,|,\s*,|,\s*$ is foundJava 测试 // 或split(",", -1) 并检查是否有任何条目为空(仅空格)
  • 是的,它是有效的。这将有资格作为一个逗号分隔的列表,这完全没问题。

标签: java regex


【解决方案1】:

你可能会使用

^[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

【讨论】:

  • 提醒@TheFourthBird。这也将匹配具有多个空格的字符串。请注意,可以有一个 两个逗号分隔的列表。这些列表由空格分隔。 =)。认为让你知道会很好。 +
  • @JvdV 我把它读成一两个逗号,其中大写字符用空格分隔。
【解决方案2】:

应该是这样的:

^[A-Z](,[A-Z])*( [A-Z](,[A-Z])*)*$

这里发生的情况如下:

  • 我们期望一个字母,可以选择后跟一个或多个逗号-立即后跟另一个字母。
  • 然后我们可以选择接受一个空格,然后是上述模式。这会重复。

测试:https://regex101.com/r/kzLhtw/1

当然,您可以通过使所有捕获组不捕获来稍微优化正则表达式:只需将?: 紧跟在( 后面,即(?:

【讨论】:

  • @JvdV 谢谢,但我认为 D T 条目实际上匹配。我更新了 regex101 的链接以包含测试用例。
  • 好吧,我的错。我在那里太快了=)。但请注意,您允许多个空间!我也注意到另一个答案。也许我今天不在那儿,但似乎 OP 正在寻找一两个逗号分隔的列表。在两个列表的情况下,这两个列表由空格分隔。无论哪种方式,你都已经获得了我的投票。
【解决方案3】:

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

不确定如何准确地解释上述内容,但我的阅读是:一个或两个逗号分隔的列表,其中每个列表可能只包含大写字符。在有两个列表的情况下,两个列表之间用一个空格隔开。

你可以试试:

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

在线查看demo

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

【讨论】:

  • (我已经投票了,我认为这会减少回溯:-))^(?!\S+ \S+ )[A-Z](?:[ ,][A-Z])*$regex101.com/r/9EXiga/1
猜你喜欢
  • 1970-01-01
  • 2023-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-31
  • 1970-01-01
  • 2013-12-28
  • 1970-01-01
相关资源
最近更新 更多