首页 > 解决方案 > 正则表达式获取语言匹配

问题描述

我有以下输入:

_YUE_ENSUB_L9939486_16X9

我想在YUEand上匹配EN。条件是:

到目前为止,我有:

([A-Z419]+)(?:SUB|FN|SUBS)?

或者:

[A-Z419]{2,5}(?=SUB)

但两者都有点不足。什么是正确的正则表达式?我想可能是这样的,但它似乎有点矫枉过正,可能不是一个很好的匹配:

[A-Z419]+(?=SUB|FN|SUBS)|[A-Z419]+(?!=SUB|FN|SUBS)

以下是来自 的示例输入regex101

标签: regex

解决方案


您可以使用捕获组并将前瞻移动到第一个下划线之后。然后将 SUB 与可选的 S 或 FN 和下划线匹配。

_(?![A-Z419]*(?:SUBS?|FN)_)([A-Z419]+)_

解释

  • _从字面上匹配
  • (?!负前瞻,断言右边的内容不匹配
    • [A-Z419]*匹配任何列出的字符 0+ 次
    • (?:SUBS?|FN)_匹配 SUB、SUBS 或 FN 后跟_
  • )关闭前瞻
  • (捕获组 1
    • [A-Z419]+匹配任何列出的字符的 1 次以上
  • )_关闭组并匹配下划线

正则表达式演示

对于更新的问题,您只能获得匹配项:

(?<=_)[A-Z419]+?(?=(?:SUBS?|FN)?_)

解释

  • (?<=_)正向向后看,断言直接在左边的是_
  • [A-Z419]+?尽可能匹配列出的字符之一
  • (?=积极的前瞻,断言什么是直接在右边
    • (?:SUBS?|FN)?_可选择匹配 SUB、SUBS 或 FN,后跟_
  • )关闭前瞻

正则表达式演示


推荐阅读