java - 正则表达式中的两个 "any"组之间是否可以有一个可选组?

标签 java regex

我有一个如下所示的正则表达式语句:

(.*)_(ce)_(.*)_([0-9]{8}).([A-Za-z]{1,20})(?:\\.[A-Za-z]{1,20})?

它应该分组 (anything)_(ce)_(anything)_(some digits).(some_ext).(some_possible_ext) .

所以,这是一个可能的传递字符串:

hello_ce_world_20192212.json.xml .

这些组是:

1. hello
2. ce
3. world
4. 20192212
5. json
6. xml

我现在想让 (ce) 可选,并使正则表达式如下所示:

(.*)_(ce_)?(.*)_([0-9]{8}).([A-Za-z]{1,20})(?:\\.[A-Za-z]{1,20})?

这样就可以通过:hello_ce_world_20192212.json.xml ,组将是:

1. hello
2. ce
3. world
4. 20192212
5. json
6. xml

这将通过:hello_world_20192212.json.xml ,组将是:

1. hello
3. world
4. 20192212
5. json
6. xml

所以,正则表达式有效!问题是,当 (ce_) 出现在正在评估的文本中时,它包含在第一组中。所以,hello_ce_world_20192212.json.xml通过正则表达式,但组是:

1. hello_ce
3. world
4. 20192212
5. json
6. xml

这违反了我上面提到的约束。不确定如何修复正则表达式以使其执行此操作;我怀疑是因为它位于两个 (.*) 之间组,它不会工作或者我的正则表达式需要更具体。只要从逻辑上思考一下,我就会明白我不太可能实现我想要的……但也许外面有人有更多的理解。有什么帮助吗?

我找到了这个website有助于测试哪些组在哪里以及其他内容。

最佳答案

您可以使用 ? 使第一组捕获非贪婪组。这个正则表达式应该可以满足您的需要:

(.*?)_(ce)?_?(.*)_([0-9]{8})\.([A-Za-z]{1,20})?\.([A-Za-z]{1,20})?

经测试https://regex101.com/r/MZqDPd/3

另请注意使 ce 成为可选但已捕获的调整,而不使用 _。这会导致其中一个可能丢失但仍然通过正则表达式的情况。请注意这一点。

关于java - 正则表达式中的两个 "any"组之间是否可以有一个可选组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64532508/

相关文章:

java - httpUrlConnextion.getContentLength 返回不正确的值

java - 通用数组作为参数

python - 将模式与模式列表中的对应项进行匹配

javascript - 如何有效地替换字符串中可能重复的字符

python - 如何在字符串中搜索任何数字后跟特定单词?

Java获取正则表达式的匹配组

java - 如何设置 Apache Tomcat 8 以在 HTTPS 上运行 servlet 应用程序

java - 无法设置带有文本标题的工具栏?

java - 为什么我的程序卡在 DatagramPacket.getData() 的 system.out.print 上

javascript - 用正则表达式替换 ID 号