正则表达式仅检查组是否存在

时间:2017-12-31 04:22:39

标签: regex regex-group

我有String,其值可能如下所示。

  1. 854METHYLDOPA
  2. 041ALDOMET / 00000101 /
  3. 133IODETO DE SODIO [I 131]
  4. 在这里我需要从索引4开始直到找到这些模式中的任何一个/ 00000101 /或[I 131]

    预期产出:

    1. ALDOMET
    2. IODETO DE SODIO
    3. 我已尝试使用以下RegEx进行相同的

      (适用:^ {3}。)(*)(?:[[/] [A-Z0-9 \ S] + [] / \ S +])

      但是如果字符串包含[/但它不适用于这些模式不存在的case1,则此RegEx可以工作。

      我试过添加?最后但它在案例1中起作用,但对案例2和3不起作用。

      有人可以帮我解决regx问题吗?

3 个答案:

答案 0 :(得分:0)

你的逻辑很难说。我的解释是你总是希望从第4个角色开始捕捉。捕获的其他内容取决于输入的其余部分。如果出现/00000101/[I 131],那么您希望在此之前进行捕获。否则,您想要捕获整个字符串。把这一切放在一起产生这个正则表达式:

^.{3}(?:(.*)(?=/00000101/|\[I 131\])|(.*))

Demo

答案 1 :(得分:0)

你可以试试这个:

^.{3}(.*?)($|(?:\s*\/00000101\/)|(?:\s*\[I\s+131\])).*$

并替换为此以获得您想要的确切输出。

\1

Regex Demo

说明:

  1. ^ - >开始一个字符串
  2. .{3} - >后跟3个字符
  3. (.*?) - >其次是什么?意味着懒惰它将获取,直到找到以下内容并且不会超出该范围。它也将其捕获为 第1组 - > \ 1
  4. ($|(?:\s*\/00000101\/)|(?:\s*\[I\s+131\])) ---------->
  5. $ - >以$结尾,这意味着没有这样的模式 你提到了
  6. |或
  7. (?:\s*\/00000101\/) - >您使用\ s *即兴创作的另一种模式,以覆盖零个或多个空格。
  8. |或
  9. (?:\s*\[I\s+131\]) - >你的另一种模式是即兴的\ s + 这意味着一个或多个空格。 ?:表示我们不会捕获 它。
  10. .*$ - > 。*只是为了匹配后面的任何内容和$  声明字符串的结尾。
  11. 所以我们最终只捕获第1组而没有其他任何确保的  用group1替换所有东西,这是你的目标输出。

答案 2 :(得分:0)

您可以在第1组中获得您要查找的值:

^.{3}(.+?)(?=$| ?\[I 131\]| ?\/00000101\/)

<强>解释

  • 从字符串^
  • 的开头
  • 匹配前3个字符.{3}
  • 在捕获组中匹配(您的值将在哪里)任何字符一次或多次非贪婪(.+?)
  • 积极向前看(?=
  • 断言以下内容是字符串$
  • 的结尾
  • |
  • 可选空格?,后跟[I 131] \[I 131\]
  • |
  • 可选空格?,后跟/ 00000101 / \/00000101\/

如果您的正则表达式引擎支持\K,您可以尝试这样做,并且您要查找的值不在组中,而是完全匹配:

^.{3}\K.+?(?=$| ?\[I 131\]| ?\/00000101\/)