正则表达式语句(replaceAll)

时间:2013-05-17 14:10:23

标签: java regex

我是Java和Regex的新手。我一直在看下面这个正则表达式似乎并不理解。这只是获取会话密钥,希望有人可以向我解释。

这是网址

URL: http://somewebsite.com/signin?SessionKey=HDGshCWo3J0000000ED6

这是代码

String sessionKey = url.replaceAll("^.*SessionKey=([^&]*).*$", "$1");
System.out.println(sessionKey);

结果

HDGshCWo3J0000000ED6

我的问题如下 对于正则表达式

^.*SessionKey=([^&]*).*$
  1. 目的是什么? (^任何字符)和*(匹配0次或更多次)^
  2. 之后
  3. 为什么不使用^ SessionKey =
  4. ([^&] *) - 为什么在这里使用分组,什么是&?
  5. 。* $ - 为何使用。和*在行结束之前?
  6. 替换

    1. $ 1 - 什么是$ 1?
    2. 感谢。

3 个答案:

答案 0 :(得分:1)

在正则表达式中^.*SessionKey=([^&]*).*$

  

1)目的是什么? (任何字符)和*(匹配0次或更多次)后^

^表示开始表达,它将匹配String的开头。这允许在SessionKey字之前的任何内容。

  

2)为什么不使用^ SessionKey =

上面解释。这不允许SessionKey之前的单词。

  

3)([^&] *) - 为什么在这里使用分组,什么是&?

&是文字&。此部分将匹配所有内容,直到找到文字&。使用分组,因此可以使用$1检索该值(如下所述)。

  

4)。* $ - 为何使用。和*在行尾之前?

.*$基本上会忽略&之后的所有内容,直到String结束。

  

$ 1 - 什么是$ 1?

这意味着第一组匹配。在正则表达式中,它是在第一个()内匹配的内容,即[^&]*

答案 1 :(得分:0)

String sessionKey = url.replaceAll("^.*SessionKey=([^&]*).*$", "$1");

"^.*SessionKey=([^&]*).*$"的匹配项替换为$1的第一个捕获的组([^&]*)

您的问题:

  1. .*基本上会匹配Sessionkey之前的所有字符,例如,我们会在.*中找到"no hello"在上下文(.*)hello中使用的匹配项}}。它的目的是消耗查询字符串中可能包含的任何字符,直到我们达到SessionKey之后我们 知道 如何提取我们想要的值。
  2. >>> grep(r'(.*)hello','no hello')
    ['no ']
    
    1. ^SessionKey=必须有SessionKey=形式的查询字符串,^锚意味着查看字符串的开头。普通查询字符串类似于www.site.com/somewith?...
    2. ([^&]*)此处用于匹配任何不是&的内容。如果找到^作为角色类[...]中的第一个字符,则表示该类中的内容反转,因此[^&]匹配所有 &。这用于捕获会话密钥的值。
    3. .*$会消耗会话密钥值后剩余的任何字符。
    4. 整个表达式$1的捕获将字符串sessionKey替换为自身,导致sessionKey等于捕获([^&]*)

答案 2 :(得分:0)

其他答案涵盖了正则表达式如何运作的主要问题,所以我不打算重复它们。

我只想注意,在查询字符串中找不到SessionKey密钥时,代码将返回原始字符串。

另一个潜在的问题是,如果有一个名为SecondarySessionKey的密钥,并且根据网址中的位置,您可能会获得SecondarySessionKey而不是SessionKey的值。< / p>

更安全的方法是使用URLURI类来挑选查询字符串,然后选择parse the query string