首页 > 解决方案 > rlike 正则表达式不处理特殊字符

问题描述

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

以下面的示例代码为例。alist它应该将第 2 行和第 3 行显示为匹配忽略大小写的项目之一。但是,下面的代码仅将第 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);

标签: javaregexapache-spark

解决方案


您的问题不在于\\Qor\\E模式,而在于\\b单词边界模式。

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

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

我得到两行:

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

推荐阅读