Java регулярное выражение - PullRequest
       14

Java регулярное выражение

0 голосов
/ 26 апреля 2019

Я хочу сопоставить строку, в которой есть "json" (встречается более 2 раз) и без строки "from" между двумя "json".

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.*

Я использую регулярное выражение, за исключением строки from.

Но после теста я обнаружил, что это регулярное выражение также соответствует строке "select get_json_object from get_json_object".

Что не так для моего регулярного выражения? Любое предложение приветствуется.

1 Ответ

1 голос
/ 26 апреля 2019

Вам нужно использовать жадный жадный жетон для достижения этой цели. Используйте это регулярное выражение,

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

Это выражение (?:(?!\bfrom\b).)+ будет соответствовать любому тексту, который не содержит from как целое слово внутри него.

Regex Demo

Для сопоставления всей строки вы можете использовать,

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

Как вы и хотели в своем посте, это регулярное выражение будет соответствовать строке, пока не найдет строку, где from не появляется между двумя json с

Демонстрация регулярных выражений с полным совпадением строк

Edit: Почему регулярное выражение OP select.*json.*?(?<!from)json.*from.* не работает как ожидалось

Ваше регулярное выражение начинает совпадать с select, а затем .* совпадает настолько, насколько это возможно, при этом убедившись, что оно находит json впереди, за которым следуют некоторые необязательные символы, а затем снова ожидает найти строку json, затем .* снова сопоставляет некоторые символы, затем ожидает найти from и, наконец, использовать .* ноль или более необязательных символов.

Давайте рассмотрим пример строки, которая должна соответствовать.

select json from json json XXXX

У него есть две json строки без from между ними, поэтому они должны совпадать, но это не так, потому что в вашем регулярном выражении порядок или присутствие json и from фиксированы, что составляет json, затем снова json затем from, что не так в этой строке.

Вот демонстрация Java-кода

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
...