【问题标题】:Two pattern in one regular expressions一个正则表达式中的两个模式
【发布时间】:2020-04-01 07:20:37
【问题描述】:

我正在尝试在对 ClickHouse 数据库的查询中结合两种情况的正则表达式:

  1. 直到符号“@” => (^[^@]+)
  2. 没有域 'company\' 和 'company.com\' => (?:company\.com\\\\\\\\+|company\\\\\\\\+)(.*)

我发现了两种使用“在线正则表达式”的方法:

  1. ^company\\\\(.*)|^(.*)@|^(?!company\\\\.*).*$
  2. (?<=company\\\\)(.*)|(.*)(?<=@)|^(?!company\\\\.*).*

但是,构造 ?!?<= 不受支持(错误:无效的 perl 运算符)。 我使用了命令extract,例如extract(User, '(?<=company\\\\)(.*)|(.*)(?<=@)|^(?!company\\\\.*).*')

请给我一些建议以了解如何使这个正则表达式适合。

括号内 - 应该通过,超出 - 不应该:

  1. 公司\[ABC-1D2E]
  2. [ABC-DE]@company.com
  3. [123-ABCDE]
  4. [12345]

【问题讨论】:

  • 你能提供应该通过和不应该通过的例子吗?
  • sure) 在括号内 - 应该通过,在括号外 - 不应该 1. company\\[ABC-1D2E] 2. [ABC-DE]@company.com 3. [123-ABCDE ] 4. [12345]

标签: regex clickhouse re2


【解决方案1】:

看来需要用到replaceRegexpOne的几个串行调用:

SELECT str,
    replaceRegexpOne(str, '(.*company\\\\)(.*)', '\\2') preliminary_result_1,
    replaceRegexpOne(preliminary_result_1, '(.*)(@company.com)', '\\1') result
FROM (
    /* test data */
    SELECT arrayJoin([
        'company\\ABC-1D2E',
        'ABC-DE@company.com',
        '123-ABCDE',
        '12345'
        ]) str
)
/* result:
┌─str────────────────┬─preliminary_result_1─┬─result────┐
│ company\ABC-1D2E   │ ABC-1D2E             │ ABC-1D2E  │
│ ABC-DE@company.com │ ABC-DE@company.com   │ ABC-DE    │
│ 123-ABCDE          │ 123-ABCDE            │ 123-ABCDE │
│ 12345              │ 12345                │ 12345     │
└────────────────────┴──────────────────────┴───────────┘
*/

【讨论】:

  • 谢谢,弗拉基米尔! replaceRegexOne 是一个很好的功能,但挑战是使用提取并为一个字段制作一个复杂的正则表达式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-17
  • 2017-01-16
  • 1970-01-01
  • 1970-01-01
  • 2023-01-31
相关资源
最近更新 更多