如何修复此正则表达式以获得上述结果?
正则表达式:(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]
结果应该是:
稍后编辑:
目前输出:
答案 0 :(得分:1)
这是你的正则表达式:
(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个最后方括号的内容,但是这个组不会重复,所以它只匹配第一个。< / p>
你有两种可能性。
将量词放在最后一组
之后(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,将鼠标悬停在匹配项上会显示捕获组的内容。
答案 1 :(得分:0)
好吧,问题似乎是最后一个Regex
捕获组。 (\[(?:M|V|P)(?:[^\[])*])
似乎不起作用。
此正则表达式捕获组\[(\w.*|(M|V|P)\d{10}AB)\]
捕获了您最后3个括号中的单词。
完整的正则表达式:(0(?:[0-9]|[A-F]){3})(\"\*?(?:SIA-DCS|ADM-CID|NULL)\")(\d{4})(R?(?:[0-9]|[A-F])*)(L[^#]*)(#[^\[]*)(\[[^\[]*)(\[(\w.*|(M|V|P)\d{10}AB)\])