0

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

这是网址

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

这是代码

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

结果

HDGshCWo3J0000000ED6

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

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

用于更换

  1. 1 美元 - 1 美元是什么?

谢谢。

4

3 回答 3

1

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

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

^表示表达式的开头,它将匹配String. 这允许SessionKey单词之前的任何内容。

2) 为什么不直接使用 ^SessionKey=

解释如上。这样的话之前就不允许了SessionKey

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

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

4) .*$ - 为什么使用 . 和 * 在行尾之前?

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

1 美元 - 1 美元是什么?

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

于 2013-05-17T14:15:41.540 回答
0

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

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

另一个潜在的问题是,如果有一些名为 的键SecondarySessionKey,并且根据 URL 中的位置,您可能会得到值SecondarySessionKey而不是SessionKey

更安全的方法是使用URLorURI类来挑选查询字符串,然后解析查询字符串

于 2013-05-17T14:37:16.443 回答
0
String sessionKey = url.replaceAll("^.*SessionKey=([^&]*).*$", "$1");

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

你的问题:

  1. .*将基本上匹配它可以匹配的所有字符,直到Sessionkey,例如,我们在 context 中找到.*匹配的内容。它的目的是消耗查询字符串中可能存在的任何字符,直到我们知道如何提取我们想要的值。"no hello"(.*)helloSessionKey
>>> grep(r'(.*)hello','no hello')
['no ']
  1. ^SessionKey=必须有一个形式的查询字符串SessionKey=^锚表示查看字符串的开头。一个普通的查询字符串就像www.site.com/somewith?...
  2. ([^&]*)这里用于匹配任何不是&. 当 a^被发现是字符类中的第一个字符[...]时,这意味着该类中的内容的反转,因此[^&]匹配除 之外 &的所有内容。这用于捕获会话密钥的值。
  3. .*$将消耗会话密钥值之后剩余的任何字符。

整个表达式的捕获$1将字符串替换为sessionKey自身,导致 sessionKey 等于捕获([^&]*)

于 2013-05-17T14:22:48.270 回答