【问题标题】:Could not find the right regex pattern找不到正确的正则表达式模式
【发布时间】:2017-01-09 17:30:14
【问题描述】:

我想写一个正则表达式来匹配每个单词:

  • 不以这 2 个字符串中的任何一个开头(TEMP_、TMP_)
  • 中间包含字符串:LME999
  • 不以这 2 个字符串中的任何一个结尾(.flag、_TEMP)
  • 在 LME999 之前和之后,字符串可以包含任何字母数字字符

我写了这个正则表达式,但它没有按预期工作

(?!TEMP_)+(?!TMP_)+(\w)+LME999+(\w)+((?!.flag)(?!_TEMP))

以下是一些有效的字符串: 字符串LME999字符串

【问题讨论】:

  • •Before and After LME46 这是错字吗?
  • 我编辑我的问题

标签: regex perl pattern-matching


【解决方案1】:

你可以使用这个正则表达式:

^(?!TE?MP_).*?LME999.*$(?<!\.flag|_TEMP)

RegEx Demo

RegEx 拆分:

^                   # line start
(?!TE?MP_)          # negative lookahead to assert failure if starts with TMP_ or TEMP_
.*?                 # match 0 or more of any char (lazy)
LME999              # match LME99
.*                  # match 0 or more of any char 
$                   # line end
(?<!\.flag|_TEMP)   # negative lookbehind to assert failure if ends with .flag or _TEMP

【讨论】:

  • (?&lt;!\.flag) 永远不会匹配。有没有想过向OP询问它?而\w+. 不包括can have 和字母数字。
  • 之前和之后总是可以使用[\p{L}\p{N}]*,因为我不确定perl中的\w是否精通脚本。无论哪种方式,[._] 都不会跳动,除非它在边界上?
  • 不,因为这种情况不起作用:abcLME999abc.any_things 和 LME999 前后的字符串是可选的,不需要
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-21
  • 2014-12-10
  • 1970-01-01
  • 2021-08-05
相关资源
最近更新 更多