【问题标题】:Regex - multiple matches正则表达式 - 多个匹配
【发布时间】:2012-03-22 11:34:05
【问题描述】:

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

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

后期编辑:

当前输出:

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

【问题讨论】:

  • 什么不起作用,目前的结果是什么?
  • 是否需要[] 或者没有它们的输出也可以。

标签: java regex match


【解决方案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个方括号的内容,但是这个组不重复,所以只会匹配第一个。

你有两种可能性。

  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

更新

您可以通过在其后添加问号来使其成为可选内容

(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,将鼠标悬停在比赛上会显示捕获组的内容。

【讨论】:

  • 谢谢,斯特马。但我实际上想避免这两种选择;
  • 那么,您对解决方案有何期望?
  • 一次将最后 3 个项目作为 3 个组提供 - 即在处理后不提供,无需添加模式 3 次。
  • 如果您想要 3 个组中的最后 3 个项目,您需要在您的模式中定义这三个组。
  • 有没有办法允许最后 3 个组中的每个组有 0 个或 1 个实例,并且没有他们的订单计数?
【解决方案2】:

嗯,问题似乎是最后一个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)\])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-21
    • 1970-01-01
    • 2017-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多