【问题标题】:rlike regex not handling special charactersrlike 正则表达式不处理特殊字符
【发布时间】:2021-09-19 06:01:14
【问题描述】:

我很难获得 (java) spark 的 rlike 方法来处理特殊字符。通常一个简单的转义 \\ 或用 \Q\E 引用就足以处理正则表达式中的特殊字符,但它们似乎不起作用。

以下面的示例代码为例。它应该将第 2 行和第 3 行显示为匹配 alist 中的一项,忽略大小写。但是下面的代码只显示第 2 行匹配。

如何根据与alist 中的一项匹配的“动物”列过滤数据集的行?

    StructType schema = new StructType(new StructField[]{
            new StructField("row_id", DataTypes.IntegerType, false, Metadata.empty()),
            new StructField("animal", DataTypes.StringType, false, Metadata.empty())
    });

    Dataset<Row> dataset = spark.createDataFrame(
            Arrays.asList(
                    RowFactory.create(1, "Bat"),
                    RowFactory.create(2, "Dog"),
                    RowFactory.create(3, "Cat (Type Not Stated)"),
                    RowFactory.create(4, "Other.")
            ), schema);


    List<String> alist = Arrays.asList(
            "\\QDOG\\E",
            "\\QCat (Type Not Stated)\\E");

    dataset = dataset.filter(dataset.col("animal").rlike(
            "(?i)\\b("+String.join("|", alist)+")\\b"
    ));

    dataset.show(5, false);

【问题讨论】:

    标签: java regex apache-spark


    【解决方案1】:

    您的问题不在于\\Q\\E 模式,而在于\\b 字边界模式。

    如果我通过删除\\b 模式来更改您的最终rlike 正则表达式,如下所示:

    dataset = dataset.filter(dataset.col("animal").rlike(
      "(?i)("+String.join("|", alist)+")"
    ));
    

    我得到了两行:

    +------+---------------------+
    |row_id|animal               |
    +------+---------------------+
    |2     |Dog                  |
    |3     |Cat (Type Not Stated)|
    +------+---------------------+
    

    【讨论】:

    • 哦,一般来说,这是否意味着特殊字符不是单词字符,还是仅针对 ) 的排除?
    • 特殊字符不是单词字符。根据java pattern documentation,单词字符为[a-zA-Z_0-9]
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-13
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多