如何修复此正则表达式以获得上述结果?
正则表达式:(0(?:[0-9]|[A-F]){3})(\"\*?(?:SIA-DCS|ADM-CID|NULL)\")(\d{4})(R?(?:[0-9]|[A-F])*)(L[^#]*)(#[^\[]*)(\[[^\[]*)(\[(?:M|V|P) (?:[^\[])*])
字符串:LCR005B"*ADM-CID"9876R579BDFL789ABC#12345A[4D32FC2B12345A|113002065][Vanydata][M1234567890AB][Panydata]
结果应该是:
- 005B
- “*ADM-CID”
- 9876
- R579BDF
- L789ABC
- #12345A
- [4D32FC2B12345A|113002065]
- [Vanydata]
- [M1234567890AB]
- [泛数据]
稍后编辑:
当前输出:
- 005B
- “*ADM-CID”
- 9876
- R579BDF
- L789ABC
- #12345A
- [4D32FC2B12345A|113002065]
- [Vanydata]
最佳答案
这是你的正则表达式:
(0(?:[0-9]|[A-F]){3})
(\"\*?(?:SIA-DCS|ADM-CID|NULL)\")
(\d{4})
(R?(?:[0-9]|[A-F])*)
(L[^#]*)
(#[^\[]*)
(\[[^\[]*)
(\[(?:M|V|P)(?:[^\[])*])
您确实只有 8 个捕获组,没有一个是重复的,您为什么认为这应该输出 10 个组?
好的,因为最后一组的(?:M|V|P)
,所以可以匹配最后3个方括号的内容,但是这组不重复,所以只会匹配第一个。
你有两种可能性。
将量词放在最后一组后面
(0(?:[0-9]|[A-F]){3})(\"\*?(?:SIA-DCS|ADM-CID|NULL)\")(\d{4})(R?(?:[0-9]|[A-F])*)(L[^#]*)(#[^\[]*)(\[[^\[]*)(\[(?:M|V|P)(?:[^\[])*])+
或
(0(?:[0-9]|[A-F]){3})(\"\*?(?:SIA-DCS|ADM-CID|NULL)\")(\d{4})(R?(?:[0-9]|[A-F])*)(L[^#]*)(#[^\[]*)(\[[^\[]*)(\[(?:M|V|P)(?:[^\[])*]){3}
现在将匹配字符串直到最后,但仍然只有 8 个捕获组,最后一个捕获组的内容现在不再是“[Vanydata]”,而是该组“[Panydata]”的最后一个匹配
向您的正则表达式添加另外两个组
(0(?:[0-9]|[A-F]){3})(\"\*?(?:SIA-DCS|ADM-CID|NULL)\")(\d{4})(R?(?:[0-9]|[A-F])*)(L[^#]*)(#[^\[]*)(\[[^\[]*)(\[(?:M|V|P)(?:[^\[])*])(\[(?:M|V|P)(?:[^\[])*])(\[(?:M|V|P)(?:[^\[])*])
现在有 10 个捕获组,结果如您所料。如果最后 3 组的起始字母对于每组始终相同,您可以将其简化为
(0(?:[0-9]|[A-F]){3})(\"\*?(?:SIA-DCS|ADM-CID|NULL)\")(\d{4})(R?(?:[0-9]|[A-F])*)(L[^#]*)(#[^\[]*)(\[[^\[]*)(\[V(?:[^\[])*])(\[M(?:[^\[])*])(\[P(?:[^\[])*])
更新
您可以通过在后面添加问号来将某些内容设为可选
(0(?:[0-9]|[A-F]){3})(\"\*?(?:SIA-DCS|ADM-CID|NULL)\")(\d{4})(R?(?:[0-9]|[A-F])*)(L[^#]*)(#[^\[]*)(\[[^\[]*)(\[[VMP](?:[^\[])*])?(\[[VMP](?:[^\[])*])?(\[[VMP](?:[^\[])*])?
查看here on Regexr ,将鼠标悬停在匹配上会显示捕获组的内容。
关于java - 正则表达式 - 多个匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9821460/