我是Java和Regex的新手。我一直在看下面这个正则表达式似乎并不理解。这只是获取会话密钥,希望有人可以向我解释。
这是网址
URL: http://somewebsite.com/signin?SessionKey=HDGshCWo3J0000000ED6
这是代码
String sessionKey = url.replaceAll("^.*SessionKey=([^&]*).*$", "$1");
System.out.println(sessionKey);
结果
HDGshCWo3J0000000ED6
我的问题如下 对于正则表达式
^.*SessionKey=([^&]*).*$
替换
感谢。
答案 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
的第一个捕获的组([^&]*)
。
您的问题:
.*
基本上会匹配Sessionkey
之前的所有字符,例如,我们会在.*
中找到"no hello"
在上下文(.*)hello
中使用的匹配项}}。它的目的是消耗查询字符串中可能包含的任何字符,直到我们达到SessionKey
之后我们 知道 如何提取我们想要的值。 >>> grep(r'(.*)hello','no hello') ['no ']
^SessionKey=
必须有SessionKey=
形式的查询字符串,^
锚意味着查看字符串的开头。普通查询字符串类似于www.site.com/somewith?...
([^&]*)
此处用于匹配任何不是&
的内容。如果找到^
作为角色类[...]
中的第一个字符,则表示该类中的内容反转,因此[^&]
匹配所有但 &
。这用于捕获会话密钥的值。.*$
会消耗会话密钥值后剩余的任何字符。整个表达式$1
的捕获将字符串sessionKey
替换为自身,导致sessionKey等于捕获([^&]*)
答案 2 :(得分:0)
其他答案涵盖了正则表达式如何运作的主要问题,所以我不打算重复它们。
我只想注意,在查询字符串中找不到SessionKey
密钥时,代码将返回原始字符串。
另一个潜在的问题是,如果有一个名为SecondarySessionKey
的密钥,并且根据网址中的位置,您可能会获得SecondarySessionKey
而不是SessionKey
的值。< / p>
更安全的方法是使用URL
或URI
类来挑选查询字符串,然后选择parse the query string。