繁体   English   中英

如何在 Matcher.replaceAll() 中进行条件正则表达式替换?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM