gpt4 book ai didi

Java 正则表达式 回溯

转载 作者:行者123 更新时间:2023-12-02 09:57:48 31 4
gpt4 key购买 nike

我想匹配一个包含“json”(出现超过 2 次)且两个“json”之间没有字符串“from”的字符串。

For example(what I want the string match or not):
select json,json from XXX -> Yes
select json from json XXXX -> No
select json,XXXX,json from json XXX -> Yes

为什么第三个是匹配的,因为我只想出现两个“json”字符串,中间没有“from”。在学习了正则表达式后视之后,我编写了这样的正则表达式:

select.*json.*?(?<!from)json.*from.*

我正在使用正则表达式lookbehind来排除from字符串。

但经过测试,我发现这个正则表达式也匹配字符串“select get_json_object from get_json_object”。

我的正则表达式出了什么问题?如有任何建议,我们将不胜感激。

最佳答案

您需要使用tempered greedy token为了实现这一目标。使用这个正则表达式,

\bjson\b(?:(?!\bfrom\b).)+\bjson\b

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

<强> Regex Demo

要匹配整行,您可以使用,

^.*\bjson\b(?:(?!\bfrom\b).)+\bjson\b.*$

就像您在帖子中想要的那样,只要找到 from 的字符串,此正则表达式就会匹配该行。没有出现在两个 json 之间

<强> Regex Demo with full line match

编辑:为什么OP的正则表达式select.*json.*?(?<!from)json.*from.*没有按预期工作

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

让我们举一个应该匹配的示例字符串。

select json from json json XXXX

它有两个 json不带 from 的字符串在两者之间,所以它应该匹配,但事实并非如此,因为在您的正则表达式中, json 和 from 的顺序或存在是固定的,即 json再说一次json然后from但该字符串中的情况并非如此。

这是一个Java code demo

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

关于Java 正则表达式 回溯,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55865384/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com