我正在解析脚本中的错误字符串,并且有一个包含不应该出现在代码行中的字符串的数组列表.

但有些字符串应该在它们不完全是字符串时传递.

例如:

列表包含"foo"和"bar"

文本行:

This is foo
and this is BAR
but not 'foo'
and not 'BAR'
but also not FOO_BAR
but we want FOO%TEXT
and also bar.text

结果

This is foo
and this is BAR
but we want FOO%TEXT
and also bar.text

我已经try 了一个我在网上和Stackoverflow上找到的例子,但这些对我来说不起作用,他们不会过滤引用的例子.

String pattern = ".*\\"+strTables[i]+"\\b.*[^(\\w|')]";
Pattern r = Pattern.compile(pattern, Pattern.CASE_INSENSITIVE);
Matcher m = r.matcher(line);
if (m.find()) {
    System.out.println (strTables[i] + ": " + line);
    break;
}

推荐答案

您需要在单词之前和之后使用\b(单词边界)才能匹配整个单词.

然后,在图案的开头用像(?<!')这样的后视来表示"not preceded by a single quote",在图案的末尾用像(?!')这样的前瞻表示"not followed by a single quote".

把它们放在一起就是

String pattern = "(?<!')\\b" + strTables[i] + "\\b(?!')";

Java相关问答推荐

在这种情况下我应该/可以使用Java抽象工厂(或工厂方法)吗?

使用SaxonJ HE在收件箱中摆脱regex

在Keycloak测试容器中的测试之间清理数据库

Springdoc Whitelabel Error Page with Spring V3

在Java中测试DAO方法:假实现与内存数据库

AlarmManager没有在正确的时间发送alert

无法传递消费者<;>;实例

使用java访问具体子类特定方法的最佳方法是什么?

为什么Java的代码工作(if condition内部的实例)

CAMEL 4中的SAXParseException

Java连接池无法正常工作

%This内置函数示例

如何在JavaFX中制作鼠标透明stage

在settings.gradle.kts和Build.gradle.kts中使用公共变量

在JDK Flight Recorder中只记录单个线程

嘲笑黄瓜中的对象

何时调用密封层次 struct 的switch 中的默认情况

判断重复的两个二维表算法?

我该如何为我的类编写getter和setter方法?

在权限列表中找不到我的应用程序