匹配以 ~ 分隔的重复块

match repeated blocks separated by ~

匹配以下文字:

文本:SS~B66~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~初步PAGES\M01~标题页(Match: OK)

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

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

更多示例:

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

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

感谢您的帮助。

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

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

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