2015-10-08 2 views
0
str = "sysparm_type=list_data&count=20&start=0&p=incident%3Bq%3Aactive%3Dtrue%5Epriority%3D1%5EEQ&table=incident" 

Я написал регулярное выражение для указанной выше строки, но хочу совместить его, только если подстрока «priority» отсутствует. Вот мое регулярное выражение: (. (?! приоритет))regex, чтобы соответствовать строке, только если подстрока нет

.*sysparm_type=list_data&count=(\d+)&start=(\d+)&p=incident.*active.*true^((?!priority).)*$&table=incident 

Но эта часть^* $ в регулярном выражении не работает.

+1

Remove '^' и '' $ из закаленной жадный маркер. –

+2

Не лучше ли вам сопоставить его как список параметров GET с фактической картой запроса, а затем проверить, присутствует ли в ключах 'priority'? – Mena

+1

Могу ли я рекомендовать regex101.com, так как это позволит вам копаться в вашем регулярном выражении. – denodster

ответ

1

(а) регулярное выражение плохое решения для строки запроса синтаксического анализа - медленная, потребление памяти, ошибки

(б) попытаться использовать любую существующую библиотеку для выполнения этой задачи, например, apache commons:

String str = "sysparm_type=list_data&count=20&start=0&p=incident%3Bq%3Aactive%3Dtrue%5Epriority%3D1%5EEQ&table=incident"; 
List<NameValuePair> pairs = URLEncodedUtils.parse(str, StandardCharsets.UTF8) 
for (NameValuePair pair : pairs) 
    if (pair.getName().equals("priority")) 
     return; // do nothing 
+0

Хотя эта ссылка может ответить на вопрос, лучше включить здесь основные части ответа и предоставить ссылку для справки. Ответные ссылки могут стать недействительными, если связанная страница изменится. – Tarec

+0

@Tarec Я добавил пример фрагмента – ursa

+0

@ursa. Я понимаю вашу точку зрения, но в этом случае я могу использовать регулярное выражение только для соответствия. Anyways stribizhev решение сделал трюк. Спасибо всем вашим предложениям. –

1

Caret^и $ матч в начале и в конце всей строки. Очень жадный.

Не было бы проще, проще читать и обслуживать, если бы вы просто проверили, чтобы строка профиля присутствовала?

String pattern = "((?!priority).)*"; <== pasted from above, prob not valid regex 

    // Create a Pattern object 
    Pattern r = Pattern.compile(pattern); 

    // Now create matcher object. 
    Matcher m = r.matcher(line); 
    if (m.find()) { 
    System.out.println("Found value"); 

    } else { 
    System.out.println("NO MATCH"); 
    } 
0

Если вы хотите проверить subString простое решение будет проверка str.indexOf(subString) возвратит int, если это больше, чем 0 то str содержит subString.

Если вы хотите сделать это в РегВыр использовать шаблон .*priority.*, вы можете еще некоторое ограничение substring, если вы уверены в своих появлений и позиции