在使用正则表达式逻辑时苦苦挣扎:如何从url查询字符串中删除param?

时间:2011-03-16 12:57:44

标签: regex coldfusion replace logic

我正在比较2个URL查询字符串,看它们是否相等;但是,如果存在,我想忽略特定的查询参数(总是带有数值)。所以,这两个查询字符串应该相等:

firstName=bobby&lastName=tables&paramToIgnore=2

firstName=bobby&lastName=tables&paramToIgnore=5

所以,我尝试使用REReplaceNoCase函数使用正则表达式替换:

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

这适用于上面的例子。我将替换应用于两个字符串然后进行比较。问题是我不能确定param将是字符串中的最后一个...以下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]*&?"),就像查询参数位于字符串I'的 middle 中一​​样ll在一个字符串中剥离一个&符号而不是另一个 - 例如

firstName=bobby&lastName=tables&paramToIgnore=2

firstName=bobby&paramToIgnore=5&lastName=tables

将成为

firstName=bobby&lastName=tables

firstName=bobbylastName=tables

我似乎无法理解这个逻辑......任何人都可以帮我解决问题吗?

5 个答案:

答案 0 :(得分:4)

如果您不能确定我建议的参数出现的顺序,那么您不会将它们与字符串本身进行比较。

我建议像这样分割字符串:

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 euqal:

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);

我很确定这可以使它更紧凑,并提供更好的性能。但是,通过比较你喜欢的字符串,你不得不在某种程度上关心参数的顺序。

答案 1 :(得分:2)

您可以在cflib上使用QueryStringDeleteVar UDF从两个字符串中删除要忽略的查询字符串变量,然后进行比较。

答案 2 :(得分:0)

分两步完成:

  1. 首先删除您的参数,如示例
  2. 中所述
  3. 然后删除在查询开始或结束时使用单独的正则表达式或查询中间的任何double / triple / ...&符号的&符号

答案 3 :(得分:0)

如何在RegEx中使用'或'来匹配开头或结尾的&符号?

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

regexpal.com

中进行测试时,似乎可以胜任这项工作

答案 4 :(得分:0)

尝试将其更改为:

REReplaceNoCase(myQueryString,“&amp;?paramToIgnore = [0-9] +”,“”)

plus而不是star应该捕获一个或多个前面匹配的字符。除了0-9之外它不会匹配任何东西,所以如果之后有另一个参数,当它无法匹配任何数字时它会停止。

或者,您可以使用:

REReplaceNoCase(myQueryString,“&amp;?paramToIgnore = [^&amp;]”,“”)

这将匹配除&符号之外的任何东西。如果参数存在但没有值,它将覆盖案例;这可能是你想要考虑的事情。