Java正则表达式查找

Java正则表达式查找,java,regex,lookbehind,Java,Regex,Lookbehind,我想在两个“json”之间匹配一个有“json”(出现2次以上)且没有“from”字符串的字符串 为什么第三个是匹配的,因为我只希望两个“json”字符串之间没有“from”。 在学习了regex lookback之后,我将这样编写regex: select.*json.*?(?<!from)json.*from.* select.*json.*?(? 我正在使用regex lookback来除去from字符串 但在测试之后,我发现这个正则表达式也与字符串“select get_json

我想在两个“json”之间匹配一个有“json”(出现2次以上)且没有“from”字符串的字符串

为什么第三个是匹配的,因为我只希望两个“json”字符串之间没有“from”。 在学习了regex lookback之后,我将这样编写regex:

select.*json.*?(?<!from)json.*from.*
select.*json.*?(?
我正在使用regex lookback来除去from字符串

但在测试之后,我发现这个正则表达式也与字符串“select get_json_object from get_json_object”匹配

我的正则表达式出了什么问题?请提供任何建议。

您需要使用正则表达式来实现此目的。使用此正则表达式

\bjson\b(?:(?!\bfrom\b).)+\bjson\b
此表达式
(?:(?!\b from\b)。+
将匹配任何不包含
中的
作为一个完整单词的文本

为了匹配整条线,您可以使用

^.*\bjson\b(?:(?!\bfrom\b).)+\bjson\b.*$
正如您在文章中所希望的那样,这个正则表达式将匹配行,只要它找到一个字符串,其中两个
json
s之间不出现
from

编辑: 为什么OP的regex
select.*json.*(?没有按预期工作

您的正则表达式开始匹配
select
,然后
*
尽可能匹配,同时确保它在前面找到
json
,后跟一些可选字符,然后再次期望找到
json
字符串,然后
*
再次匹配一些字符,然后期望从
中找到
d最后使用
*
零个或多个可选字符

让我们以一个应该匹配的字符串为例

select json from json json XXXX
它有两个
json
字符串,中间没有
from
,因此它应该匹配,但不匹配,因为在正则表达式中,json和from的顺序或存在是固定的,即
json
,然后是
json
然后
from
,而在这个字符串中不是这样的

这是一个


我不明白为什么第三个示例是匹配的。它在两个
json
之间夹有
from
,所以这不符合条件吗?选择json,json from json XXX->Yes这不应该是“否”,因为它在两个“json”之间有“from”?因为我只想匹配两个以上没有“from”的json第三个示例已经有两个“json”字符串出现在前面。我认为OP需要,如果它发现两个
json
字符串之间没有出现
from
的字符串,那么这行应该匹配。@yunfan:请检查我的答案,让我知道这是否是您想要的,否则请添加更多详细信息。非常感谢,这个正则表达式正是我想要的。但是您能向我解释一下,有什么问题吗我的正则表达式?@yunfan:当然,让我在我的帖子中解释一下为什么你的正则表达式不起作用。它适用于Java或任何语言,就像它在正则表达式中工作一样。你能展示你正在尝试的代码吗?我使用的是scala shell:Pattern.compile(^.*\bjson\b(?(?!\bfrom\b)。+\bjson\b.*$).matcher(“从json XXX中选择json,XXXX,json(XXXXXX))。发现这个答案是错误的。非常感谢。这两个网站对我也很有帮助。
select json from json json XXXX
List<String> list = Arrays.asList("select json,json from XXX","select json from json XXXX","select json,json from json XXX","select json from json json XXXX");

list.forEach(x -> {
    System.out.println(x + " --> " + x.matches(".*\\bjson\\b(?:(?!\\bfrom\\b).)+\\bjson\\b.*"));
});
select json,json from XXX --> true
select json from json XXXX --> false
select json,json from json XXX --> true
select json from json json XXXX --> true