Борьба с логикой регулярных выражений: как удалить параметр из строки запроса URL? - PullRequest
2 голосов
/ 16 марта 2011

Я сравниваю 2 строки URL-запроса, чтобы увидеть, равны ли они; однако я хочу игнорировать конкретный параметр запроса (всегда с числовым значением), если он существует. Итак, эти 2 строки запроса должны быть равны:

firstName=bobby&lastName=tables&paramToIgnore=2

firstName=bobby&lastName=tables&paramToIgnore=5

Итак, я попытался использовать регулярное выражение, используя функцию REReplaceNoCase:

REReplaceNoCase(myQueryString, "&paramToIgnore=[0-9]*", "")

Это прекрасно работает для приведенного выше примера. Я применяю замену для обеих строк, а затем сравниваю. Проблема в том, что я не могу быть уверен, что параметр будет последним в строке ... следующие 2 строки запроса также должны быть равны:

firstName=bobby&lastName=tables&paramToIgnore=2

paramToIgnore=5&firstName=bobby&lastName=tables

Итак, я изменил регулярное выражение, чтобы сделать предыдущий амперсанд необязательным ... "&?paramToIgnore=[0-9]*". Но - эти строки все равно не будут равны, так как у меня останется дополнительный амперсанд в одной из строк, но не в другой:

firstName=bobby&lastName=tables

&firstName=bobby&lastName=tables

Аналогично, я не могу просто удалить предшествующие и следующие амперсанды ("&?paramToIgnore=[0-9]*&?"), как если бы параметр запроса был в середине строки, которую я зачеркну одним амперсандом слишком много в одной строке, а не в другой - например,

firstName=bobby&lastName=tables&paramToIgnore=2

firstName=bobby&paramToIgnore=5&lastName=tables

станет

firstName=bobby&lastName=tables

firstName=bobbylastName=tables

Кажется, я не могу разобраться в логике этого ... Кто-нибудь может мне помочь с решением?

Ответы [ 5 ]

4 голосов
/ 16 марта 2011

Если вы не можете быть уверены в порядке появления параметров, я бы порекомендовал вам не сравнивать их по самой строке.

Я рекомендую разделить строку следующим образом:

String stringA = "firstName=bobby&lastName=tables&paramToIgnore=2";
String stringB = "firstName=bobby&lastName=tables&paramToIgnore=5";

String[] partsA = stringA.split("&");
String[] partsB = stringB.split("&");

Затем просмотрите массивы и сделайте paramToIgnore как-нибудь равным:

for(int i = 0; i < partsA.length; i++)
{
  if(partsA[i].startsWith("paramToIgnore"){
   partsA[i] = "IgnoreMePlease";
  }
}

for(int j = 0; j < partsB.length; j++)
{
  if(partsB[i].startsWith("paramToIgnore"){
   partsB[i] = "IgnoreMePlease";
  }
}

Затем вы можете отсортировать и сравнить массивы, чтобы увидеть, равны ли они:

Arrays.sort(partsA);
Arrays.sort(partsB);
boolean b = Arrays.equals(partsA, partsB);

Я почти уверен, что это можно сделать более компактным и повысить производительность. Но сравнивая строки, как вы, вы всегда должны заботиться о порядке своих параметров.

2 голосов
/ 16 марта 2011

Вы можете использовать QueryStringDeleteVar UDF на cflib, чтобы удалить переменные строки запроса, которые вы хотите игнорировать из обеих строк, а затем сравнить их.

0 голосов
/ 16 марта 2011

попробуйте изменить его на:

REReplaceNoCase (myQueryString, "&? ParamToIgnore = [0-9] +", "")

плюс вместо звезды должен захватывать 1 или более предшествующих совпадающих символов. Он не будет совпадать ни с чем, кроме 0-9, поэтому, если после этого появится другой параметр, он остановится, если не сможет найти другие цифры.

В качестве альтернативы вы можете использовать:

REReplaceNoCase (myQueryString, "&? ParamToIgnore = [^ &]", "")

Это будет соответствовать чему угодно, кроме амперсанда. Он будет охватывать случай, если параметр существует, но значения нет; это, вероятно, то, что вы хотели бы отчитаться.

0 голосов
/ 16 марта 2011

Как насчет наличия 'или' в RegEx, чтобы соответствовать амперсанду в начале или в конце?

&paramToIgnore=[0-9]*|paramToIgnore=[0-9]*&

Кажется, делает работу при тестировании в regexpal.com

0 голосов
/ 16 марта 2011

Сделать это в два этапа:

  1. сначала удалите ваш параметр, как вы описали в примере
  2. затем удалите амперсанд, оставленный в начале или конце запроса с отдельным регулярным выражением, или любые двойные / тройные / ... амперсанды в середине запроса
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...