【问题标题】:Kafka exclude topics to subscribe toKafka 排除要订阅的主题
【发布时间】:2021-04-20 14:28:05
【问题描述】:

目前我正在使用这个“正则表达式”消耗多个 topcis:^device-*

这个正则表达式让我订阅

device-gnt-q100-a
device-gnt-q100-a-commands
device-ant-q100-b
device-ant-q100-b-commands
device-ant-q535-a
device-dnq-qpo-def
device-dnq-qpo-def-commands
device-gda-qpp001-xyz
device-gda-qpp001-xyz-commands

是否有可能以某种方式排除所有以 -commands 结尾的主题?

试过了,没有成功:

^(?!device-\w*-commands)device-*
^(?!.*[-]commands$)device-.*$

【问题讨论】:

  • 正则表达式是包容性的,所以如果你想忽略任何以-commands 结尾的东西,使用.*$ 的任何东西都是不正确的,因为它会捕获它。此外,这些名称都不是以device- 结尾的,因此您不应该在(?!) 组之后使用它。除此之外,device-* 也与这些名称不匹配,但 device-.* 确实...根据您发布的内容,device-[ga]nt-q100-[ab] 可以使用,但也许您还有更多示例?
  • 感谢您的回复。我添加了更多示例。我确实通过使用“^device-*”获得了所有主题,但也许这在 kafka 中很特别,通常不适用于正则表达式?
  • 我不确定我是否理解这个问题。正则表达式确实有效。在我看来,负前瞻很难使用,应该尽可能避免
  • 不过,如果您想排除 -commands,您的所有示例都将匹配“device 后跟三个连字符部分,至少一个字符”,所以 ^device(-[0-9a-z]{1,6}){3}$

标签: apache-kafka kafka-consumer-api


【解决方案1】:

这应该可以工作:^(?!device-\w*-commands)device-*

【讨论】:

  • 这似乎根本没有订阅任何内容。也许我应该更清楚。示例主题是: device-q100-a device-q100-a-commands device-q100-b device-q100-b-commands
  • ^(?!.*[-]commands$)device-.*$ 是一个有效的正则表达式,可与在线正则表达式测试人员一起使用,但似乎也不起作用。
【解决方案2】:

librdkafka 使用的正则表达式库中有一个bug,它在负前瞻时失败。 我找到了一个适合我的解决方案,尽管它很丑:

^device-.*([^s]|[^d]s|[^n]ds|[^a]nds|[^m]ands|[^m]mands|[^o]mmands|[^c]ommands)$

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-26
    • 2017-07-31
    • 1970-01-01
    • 1970-01-01
    • 2021-01-28
    相关资源
    最近更新 更多