【问题标题】:match repeated blocks separated by ~匹配由 ~ 分隔的重复块
【发布时间】:2021-05-26 21:38:41
【问题描述】:

要匹配以下文本:

文字:SS~B66\88~PRELIMINARY PAGES\M01~HEADING PAGES

格式如下:<code1>~<description1>\<code2>~<description2>\<code3>~<description3>....<codeN>~<descriptionN>

我使用了这个正则表达式:[A-Z0-9 ]+~[A-Z0-9 ]+(?:\\[A-Z0-9 ]+~[A-Z0-9 ]+)+

所以:

案例 1。 SS~B66\88~初步页面\M01~标题页(Match: OK)

案例 2。 SS~B66\88~初步页面~标题页(No Match: OK because I removed the code 'M01')

案例 3。 SS~B66~初步页面\M01~标题页(No Match: OK because I removed the code '88')

更多示例:

  • SS~B66\88~MEKLKE\M01~MOIIE

  • B~A310\0~PRELIM@INARY\00-00~航向

我的问题是<code><description> 可以接受任何类型的字符,所以当我将正则表达式替换为:

我的新正则表达式 .+~.+(?:\\.+~.+)+ ,但它可以匹配 case 2case 3

感谢您的帮助。

【问题讨论】:

  • 感谢您的回答。是的,我知道我已经尝试过了。+?但它会在第一个匹配的字符处停止
  • 您声明示例数据有<code>~<description>,但这有3 个部分SS~B66\88~PRELIMINARY,有2 个部分PAGES\M01~HEADING,最后有一个单独的词。你可以让它非常具体,但这就是你所追求的吗? regex101.com/r/P7mjjG/1你能举一个字符串的例子,它包含应该仍然匹配的各种字符与不应该匹配的字符吗?
  • 每次用“\”分隔后只有一个块:例如<code>~<description> \ <code>~<description> \ <code>~<description>
  • 我编辑了问题
  • 可以使用^[^~]+~[^\\]+(?:\\[^~]+~[^\\]+)+$,见regex demo

标签: java regex match


【解决方案1】:

您可以使用否定字符类[^~\\] 匹配除\~ 之外的任何字符,而不是使用不会匹配所有允许的字符的[A-Z0-9 ] 或匹配太多字符的.+为匹配的部分设置边界。

^[^~]+~[^~\\]+(?:\\[^~]+~[^~\\]+)+$
  • ^ 字符串开始
  • [^~]+~ 匹配除~ 以外的任何字符,然后匹配~
  • [^~\\]+ 重复匹配 1+ 次 @987654334 以外的任何字符@`
  • (?:非捕获组
    • \\[^~]+~[^~\\]+~ 之前和~ \ 之后的其他字符之间匹配\~
  • )+ 关闭组并重复 1 次或多次以匹配至少一个 \
  • $ 字符串结束

Regex demo (该演示包含\n 以不跨越示例数据中的换行符)

【讨论】:

  • 感谢您对它进行小的修改:^[^\\~]+~[^~\\]+(?:\\[^\\~]+~[^~\\]+)+$ 不匹配 B~A310\0~PRELIMINARY PAGES\\\\00-00~HEADING PAGES 例如
  • @NourAtfaoui 这似乎适用于添加的用例,不包括所有否定字符类中的反斜杠。 regex101.com/r/67gQxi/1
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-08-19
  • 1970-01-01
  • 1970-01-01
  • 2021-03-27
  • 2018-08-11
  • 1970-01-01
  • 2014-06-13
相关资源
最近更新 更多