正则表达式查找不包含指定值的字符串

时间:2014-12-04 15:52:44

标签: regex string notepad++

我正在使用notepad ++的正则表达式搜索函数来查找.txt文档中不包含特定值的所有字符串(以下示例中的HIJ),其中所有字符串都以相同的值开头(以下示例中的ABC) )。

我将如何做到这一点?

实施例

  • 每个字符串以ABC
  • 开头
  • ABC从不在开头以外的字符串中使用, ABCABC123将是两个字符串 - “ABC”和“ABC123”
  • HIJ可能会在字符串中多次出现
  • 我需要找到不包含HIJ的字符串
  • 输入是一个长文件,没有换行符,但包含特殊字符(*,^,@,〜,:)和空格

示例输入:

ABC1234HIJ56ABC7@HIJABC89ABCHIJ0ABE:HIJABC12~34HI456J

示例输入将被视为以下字符串

ABC1234HIJ56
ABC7@HIJ
ABC89
ABCHIJ0ABE:HIJ
ABC12%34HI456J

第三和第五个字符串都缺少“HIJ”,因此包含在输出中,所有其他字符串都不包含在输出中。

示例所需输出:

ABC89
ABC12~34HI456J

我是RegEx的新手99%,并且将来会更多地关注它,因为我的工作描述本周早些时候突然改变了,当时公司的其他人突然离开,因此我一直在通过搜索手动执行此操作( ABC | HIJ)并查看搜索功能的结果,查找“ABC”连续出现两次。据说这位前雇员能够以自动方式完成这项工作,但没有留下任何文件。

任何帮助将不胜感激!

这个问题是我提出的先前问题的重复,但我在格式化问题方面非常糟糕,而且它似乎已经超出了明显的水平。

3 个答案:

答案 0 :(得分:2)

您可以找到所需的项目:

ABC(?:[^HA]+|H(?!IJ)|A(?!BC))*+(?=ABC|$)

注意:在第一种模式中,您可以将(?=ABC|$)替换为(?!HIJ)

模式细节:

ABC
(?:            # non-capturing group
    [^HA]+     # all that is not a H or an A
  |            # OR
    H(?!IJ)    # an H not followed by IJ
  |
    A(?!BC)    # an A not followed by BC
)*+            # repeat the group
(?=ABC|$)      # followed by "ABC" or the end of the string

注意:如果您要删除所有不是您想要的项目,可以将此搜索替换为:

search: (?:ABC(?:[^HA]+|H(?!IJ)|A(?!BC))*+HIJ.*?(?=ABC|$))+|(?=ABC)
replace: \r\n

答案 1 :(得分:0)

您可以使用以下表达式来匹配您的标准:

(^ABC(?:(?!HIJ).)*$)

这从ABC开始并向前看(负)HIJ模式。该模式适用于分离的字符串。

对于单行模式(在您的问题中提供),稍作修改(如下):

(ABC(?:(?!HIJ).)*?)(?=ABC|$)

答案 2 :(得分:0)

你可以使用这种模式

(ABC(?:(?!HIJ).)*?)(?=ABC|\R)

Demo

(               # Capturing Group (1)
  ABC           # "ABC"
  (?:           # Non Capturing Group
    (?!         # Negative Look-Ahead
      HIJ       # "HIJ"
    )           # End of Negative Look-Ahead
    .           # Any character except line break
  )             # End of Non Capturing Group
  *?            # (zero or more)(lazy)
)               # End of Capturing Group (1)
(?=             # Look-Ahead
  ABC           # "ABC"
  |             # OR
  \R            # <line break>
)               # End of Look-Ahead