[英]How can one make a conditional regex replacement in Matcher.replaceAll()?
我有一个文件路径,我将其分成几组(使用正则表达式语句)。 每个组由_
分隔。 许多组是可选组。 它看起来像这样:
Pattern pattern = Pattern.compile(regEx);
Matcher matcher = pattern.matcher(path.toLowerCase());
if (matcher.find())
{
String type = matcher.replaceAll("$2_$3");
return type.replaceAll("-","_");
}
所以,假设我有一条路径: hello_world_20190221.xml.json
。 让我们也说这是我的正则表达式:
(.*?)_(ce)?_?(.*)_([0-9]{8})\.([A-Za-z]{1,20})?\.([A-Za-z]{1,20})?
.
目前, matcher.replaceAll("$2_$3")
语句将返回给我type=_world
。 我需要替换字符串才能具有条件逻辑。 如果$2
为空,则仅返回$3
。 否则,返回$2_$3
。 replaceAll() function 是否支持条件正则表达式逻辑? 我没有取得任何成功。
这段特定代码的目的是为 replaceAll() function 使用路径、正则表达式和表达式。它返回一个组或一些组的串联。 我无法更改此代码以包含 if 语句等。 但我认为我可以用任何其他方式更改代码。 因此,如果一起使用不同的 function 可以满足我的要求,请提出一个建议。 这段代码有很多不同的场景贯穿其中,所以我不能只计划一个场景(比如放置一个 if 语句来检查第 2 组是否为空)。 所有条件逻辑都必须通过这三个字符串之一:路径、正则表达式或替换字符串。 我可以一起更改 function,但不能明确(通过源代码)检查是否满足条件或条件。
我说的有道理吗?
您可以修改您的正则表达式,将可选的$2
和$3
合并到同一个捕获组中,如下所示:
^([^_]*)_((?:ce_)?[^_]*)_([0-9]{8})\.([A-Za-z]{1,20})?\.([A-Za-z]{1,20})?
然后你只需要使用:
if (matcher.find()) {
String type = matcher.replaceAll("$2");
return type.replaceAll("-","_");
}
Java 基于代码的解决方案:
需要替换字符串具有条件逻辑。 如果
$2
为空,则仅返回$3
。 否则,返回$2_$3
由于您已经有一个匹配器,您可以这样做:
if (matcher.find()) {
String type = (matcher.group(2) == null || matcher.group(2).isEmpty() ?
matcher.replaceAll("$2") :
matcher.replaceAll("$2_$3"));
return type.replaceAll("-","_");
}
简单地使用(ce_?)?(.*)
,并替换为$2$3
。 如果$2
为空,则$2$3
将为$3
,否则,它将类似于$2_$3
:
(.*?)_(ce_?)?(.*)_([0-9]{8})\.([A-Za-z]{1,20})?\.([A-Za-z]{1,20})?
hello_ce_world_20190221.xml.json // ce_world
hello_world_20190221.xml.json // world
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.