gpt4 book ai didi

除了可选后缀之外,Java 正则表达式匹配贪婪数据

转载 作者:行者123 更新时间:2023-11-30 06:58:21 28 4
gpt4 key购买 nike

给定一个字符串

Prefix without commas, remainder with optional suffix (optional suffix)

一次性匹配和提取字符串的 3 部分的最佳 Java 正则表达式是什么?

  1. 前缀到第一个逗号
  2. 左括号内的余数
  3. 括号内的后缀

对于上面的例子,3 组(引号内)将是

  1. “没有逗号的前缀”
  2. “带有可选后缀的余数”
  3. “(可选后缀)”

字符串的所有 3 个部分都是可变长度的。 “剩余”部分本身可能包含逗号和圆括号,可选后缀可能以空格开头,也可能不以空格开头,后跟左括号,后跟零个或多个字符,后跟右括号,后跟可选空格,再后跟行尾。

尝试类似的东西

([^,]*),(.*)(\s*\(.*\))?

只产生第 1 组和第 2 组,将第 3 组放在第 2 组的末尾。

最佳答案

([^,]*),(.*)(\s*\(.*\))?

失败的原因是正则表达式已经通过 ([^,]*),(.*) 成功并且不需要检查(回溯)其余部分。

要使其正常工作,请按如下方式更改它(可能有多个选项),它可以不匹配最后一个括号,也可以匹配最后一个括号:

^([^,]*),(.*[^\) ]\s*$) | ([^,]*),(.*)(\s*\(.*\))\s*$

结果($1 + $3$2 + $4应该合并,$1$2被填充如果没有可选前缀):

3: Prefix without commas
4: remainder with optional suffix
5: (optional suffix)

这里我假设你的可选后缀可以出现多次。阅读问题的另一种方法是您希望重复中间部分,即 $3 包含在 $2 中。您可以按如下方式执行此操作:

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

结果:

1: Prefix without commas
2: remainder with optional suffix (optional suffix)
3: (optional suffix)

编辑:更新以上正则表达式以允许在右括号后有空格(这很微妙,您需要将空格添加到负字符类),并锚定正则表达式以加快速度并减少回溯

关于除了可选后缀之外,Java 正则表达式匹配贪婪数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32771216/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com