java - rlike 正则表达式不处理特殊字符
问题描述
我很难获得(java)spark 的 rlike 方法来处理特殊字符。通常一个简单的转义\\
或引用\Q
and\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);
解决方案
您的问题不在于\\Q
or\\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)|
+------+---------------------+
推荐阅读
- java - 我的老师说我应该将布尔变量移动到循环中。但我不明白该怎么做
- php - PhpSpreadsheet MimeType 生成 vnd.ms-office 而不是 vnd.ms-excel
- openshift - 对一个 openshift 服务的更改传递到其他服务?
- javascript - 通过 PHP 访问已发布的 Javascript 变量
- xslt - 如何在不删除命名空间声明的情况下删除命名空间名称
- winforms - 如何在 C# 中的 WindowsForm 应用程序中更新 ListBox 中的项目
- python - Python sphinx 如何列出函数的模块名称
- mysql - 是否可以使用用户的名字/姓氏在 MySQL 中创建唯一的用户名?
- excel - Excel中的自定义格式日期
- slider - JSSOR 我的滑块在小分辨率下太小