【问题标题】:Need to match but exclude from a list需要匹配但从列表中排除
【发布时间】:2012-10-17 13:56:36
【问题描述】:

(AEF01?/.*|.*/FC070?/.*).* 会找到

AEF01/AL020/na/na/na

ABB03/FC070/na/na/na

但不是

ANB00/FF030/na/na/na

但我希望它反过来 - 我希望它查看第一列并忽略任何 AEF01 代码,但在该列中选择其他任何内容,同时查看第二列并忽略 FC070 但选择其他任何东西。 AEF01FC070 可能并不总是一起出现。

我试过[^](?!)(?<!) 都无济于事。 我很想解决这个问题,因为我的项目没有这个表达式就停止了。

【问题讨论】:

  • 你能再澄清一下吗?

标签: regex regex-negation regex-lookarounds


【解决方案1】:

我建议你使用正则表达式模式

((?<=^)(?!AEF01)[A-Z0-9]{5}(?=\/)|(?<=^[A-Z0-9]{5}\/)(?!FC070)[A-Z0-9]{5}(?=\/|$))

【讨论】:

  • ^(?&lt;=^)有什么区别?
  • @m.buettner - 没什么,只是美丽 :) 这样(..|..) 模式的两个部分都使用相同的逻辑,因为它们具有后向和前瞻。
  • 我认为你匹配了错误的位。当我读到它时,他想匹配所有行,但是在带有AEF01FC070 的行中,他想删除这些列。当然,这必须通过捕获组和/或替换来完成;)。
【解决方案2】:

更短的方法:

^(?!AEF01/)\w+/(?!FC070/)\w+/.*$

如果您需要排除下划线,您需要将\w 更改为[A-Z0-9]

在使用 Boost 正则表达式语法的 Sublime Text 2 中测试

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-23
    • 2017-11-05
    • 2015-03-23
    • 2014-06-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多