正则表达式 - 多个匹配

时间:2012-03-22 11:34:06

标签: java regex match

如何修复此正则表达式以获得上述结果?

正则表达式:(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]

结果应该是:

  1. 005B
  2. “* ADM-CID”
  3. 9876
  4. R579BDF
  5. L789ABC
  6. #12345A
  7. [4D32FC2B12345A | 113002065]
  8. [Vanydata]
  9. [M1234567890AB]
  10. [Panydata]
  11. 稍后编辑:

    目前输出:

    1. 005B
    2. “* ADM-CID”
    3. 9876
    4. R579BDF
    5. L789ABC
    6. #12345A
    7. [4D32FC2B12345A | 113002065]
    8. [Vanydata]

2 个答案:

答案 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>

你有两种可能性。

  1. 将量词放在最后一组

    之后
    (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]”

  2. 在正则表达式中再添加两个组

    (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(?:[^\[])*])
    

    here on Regexr

  3. <强>更新

    您可以通过在其后添加问号来制作可选项

    (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)\])