java - 正则表达式 - 多个匹配

标签 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. [泛数据]

稍后编辑:

当前输出:

  1. 005B
  2. “*ADM-CID”
  3. 9876
  4. R579BDF
  5. L789ABC
  6. #12345A
  7. [4D32FC2B12345A|113002065]
  8. [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个方括号的内容,但是这组不重复,所以只会匹配第一个。

你有两种可能性。

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

关于java - 正则表达式 - 多个匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9821460/

相关文章:

java - 将 BigDecimal 转换为不带尾随零的 String

c# - 正则表达式 C# 是否可以在替换中使用变量?

python - 使用 Python,您可以使用正则表达式 grep 遍历文件而不将其全部拉入内存吗?

java - 控件的首选大小是多少?

java jlabel 单击/拖动

java - DateUtils.parseDate 不会在无效日期上抛出 ParseException

javascript - 正则表达式 - 如何查找未包含在 html 标记中或它们之间的单词

javascript - 在 react 应用程序上使用 match() 进行正则表达式出现错误

javascript - 在 JavaScript 中,使用 .match 分割字符串在 for 循环内不起作用

excel - 使用 INDEX 和 MATCH 返回多个值而不使用 VBA