我有一个如下所示的正则表达式语句:
(.*)_(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/