Java 11 通用正则表达式来解析给定的字符串值

Java 11 Generic Regex to parse a given String value

我正在做一个副项目,我需要解析字符串以获得子字符串

我有一个 REST API 在有效负载中包含一个字符串参数。此字符串值的模式可以在任何已登记的模式中有所不同:

  1. [姓名]
  2. [姓名 1]、[姓名 2]
  3. [姓名 1] 和 [姓名 2]
  4. [姓名 1]、[姓名 2] 和 [姓名 3]
  5. [姓名 1]、[姓名 2] 和 [姓名 3]、[角色]

我试过的选项:

这里,由客户端决定格式并相应地设置格式值是一种负担,这绝对不是一个好的做法

是否有更通用的正则表达式模式可以满足上述每种模式?

这是一个涵盖所有 5 种输入类型的通用正则表达式模式:

^\[.*?\](?:(?:,|\s+and\s+)\s*\[.*?\](?:\s+and\s+\[.*?\])*)*$

Demo

正则表达式解释:

^                    start of string
\[.*?\]              match [Name]
(?:
    (?:,|\s+and\s+)  match either comma or "and" separator
    \s*              optional whitespace
    \[.*?\]          another [Name 2]
    (?:
        \s+and\s+    "and" separator
        \[.*?\]      more [Name] terms
    )*               zero or more
)*                   zero or more
$                    end of string

你可以在方括号之间重复匹配所有的模式:

^\[[^\]\[]*](?:(?:,| and) \[[^\]\[]*])*$

在部分中,模式匹配:

  • ^ 字符串开头
  • \[[^\]\[]*] 匹配来自 [....]
  • (?:非捕获组
    • (?:,| and) 匹配逗号后跟 space 或 and 后跟 space
    • \[[^\]\[]*] 匹配来自 [....]
  • )*关闭非捕获组并选择性重复
  • $ 字符串结束

Regex demo

在 Java 中使用双重转义反斜杠:

String regex = "^\[[^\]\[]*](?:(?:,| and) \[[^\]\[]*])*$"