Java 11 通用正则表达式来解析给定的字符串值
Java 11 Generic Regex to parse a given String value
我正在做一个副项目,我需要解析字符串以获得子字符串
我有一个 REST API 在有效负载中包含一个字符串参数。此字符串值的模式可以在任何已登记的模式中有所不同:
- [姓名]
- [姓名 1]、[姓名 2]
- [姓名 1] 和 [姓名 2]
- [姓名 1]、[姓名 2] 和 [姓名 3]
- [姓名 1]、[姓名 2] 和 [姓名 3]、[角色]
我试过的选项:
在请求负载中包含另一个描述字符串值格式的参数。例如:如果要将模式 #4 的字符串值作为输入传递,这里是我期望的有效负载:
{
"值":"名称 1、名称 2 和名称 3",
“格式”:4
}
这里,由客户端决定格式并相应地设置格式值是一种负担,这绝对不是一个好的做法
- 以某种方式确定格式(例如:计算逗号和 AND 关键字的数量)并相应地使用专用于该格式的正则表达式
例如:如果字符串至少包含一个逗号、出现的 AND 关键字和 AND 关键字后的逗号,则它可能是模式 #5(如上表所述)。所以使用 Reg-ex 模式:
([a-zA-Z]+( [a-zA-Z]+)+),([a-zA-Z]+( [a-zA-Z]+)+),[a-zA-Z]+
这种方法确实有效,但仍然过于死板而不实用。例如:考虑 4 个名称(而不是 3 个)作为值的一部分,上述模式将不起作用
是否有更通用的正则表达式模式可以满足上述每种模式?
这是一个涵盖所有 5 种输入类型的通用正则表达式模式:
^\[.*?\](?:(?:,|\s+and\s+)\s*\[.*?\](?:\s+and\s+\[.*?\])*)*$
正则表达式解释:
^ 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
\[[^\]\[]*]
匹配来自 [....]
)*
关闭非捕获组并选择性重复
$
字符串结束
在 Java 中使用双重转义反斜杠:
String regex = "^\[[^\]\[]*](?:(?:,| and) \[[^\]\[]*])*$"
我正在做一个副项目,我需要解析字符串以获得子字符串
我有一个 REST API 在有效负载中包含一个字符串参数。此字符串值的模式可以在任何已登记的模式中有所不同:
- [姓名]
- [姓名 1]、[姓名 2]
- [姓名 1] 和 [姓名 2]
- [姓名 1]、[姓名 2] 和 [姓名 3]
- [姓名 1]、[姓名 2] 和 [姓名 3]、[角色]
我试过的选项:
在请求负载中包含另一个描述字符串值格式的参数。例如:如果要将模式 #4 的字符串值作为输入传递,这里是我期望的有效负载:
{
"值":"名称 1、名称 2 和名称 3",
“格式”:4
}
这里,由客户端决定格式并相应地设置格式值是一种负担,这绝对不是一个好的做法
- 以某种方式确定格式(例如:计算逗号和 AND 关键字的数量)并相应地使用专用于该格式的正则表达式
例如:如果字符串至少包含一个逗号、出现的 AND 关键字和 AND 关键字后的逗号,则它可能是模式 #5(如上表所述)。所以使用 Reg-ex 模式:
([a-zA-Z]+( [a-zA-Z]+)+),([a-zA-Z]+( [a-zA-Z]+)+),[a-zA-Z]+
这种方法确实有效,但仍然过于死板而不实用。例如:考虑 4 个名称(而不是 3 个)作为值的一部分,上述模式将不起作用
是否有更通用的正则表达式模式可以满足上述每种模式?
这是一个涵盖所有 5 种输入类型的通用正则表达式模式:
^\[.*?\](?:(?:,|\s+and\s+)\s*\[.*?\](?:\s+and\s+\[.*?\])*)*$
正则表达式解释:
^ 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\[[^\]\[]*]
匹配来自[....]
)*
关闭非捕获组并选择性重复$
字符串结束
在 Java 中使用双重转义反斜杠:
String regex = "^\[[^\]\[]*](?:(?:,| and) \[[^\]\[]*])*$"