我有一个将以这种格式出现的字符串 -
/pep/v1/clients/clientId/tester
我需要使用上述格式验证我的字符串并从中提取clientId
示例可以是 -
/pep/v1/clients/ST-980/tester
/pep/v1/clients/123/tester
/pep/v1/clients/Hello%20World/tester
所以clientId
通常可以是任何东西,所以我需要匹配clientId
中的任何内容。它可以是数字,字符串或数字和字符串混合或字母数字字符串。
所以我提出了以下正则表达式,但它并没有适用于上述所有示例。
^/pep/v1/clients/[0-9A-Za-z]+/tester$
我正在使用Java,在将我的字符串与上面的正则表达式匹配后,我需要从中提取clientId。
答案 0 :(得分:1)
您可以使用此正则表达式:
^\/pep\/v1\/clients\/([^\/]+)\/tester$
Java正则表达式,
^/pep/v1/clients/([^/]+)/tester$
然后打印组索引1以获得所需的输出。
它使用了/
字符被否定的char类,因此匹配组中不会接受foo/bar
之类的内容。
String[] arr = {"/pep/v1/clients/ST-980/tester",
"/pep/v1/clients/123/tester",
"/pep/v1/clients/Hello%20World/tester" };
for (String s: arr)
{
Matcher m = Pattern.compile("^/pep/v1/clients/([^/]+)/tester$").matcher(s);
while(m.find())
{
System.out.println(m.group(1));
}
}
输出:
ST-980
123
Hello%20World
答案 1 :(得分:0)
试试这个:
^\\/pep\\/v1\\/clients\\/(.+)\\/tester$
.
将匹配任何字符。
答案 2 :(得分:0)
"^\\/pep\\/v1\\/clients\\/(.+)\\/tester$"
会做你需要的。
请注意,您必须使用/
转义\
,因为\
是Java中的转义字符,您也必须将其转义,因此\\/
匹配/
字面意思。
Here is a link to how you can experiment with it.
^
断言行开头的位置
\/
字面匹配字符/
pep
字面匹配字符pep
(区分大小写)
\/
字面匹配字符/
v1
字面匹配字符v1
(区分大小写)
\/
字面匹配字符/
clients
字面匹配字符clients
(区分大小写)
\/
字面匹配字符/
第一个捕获组(.+)
.+
匹配任何字符(换行符除外)
量词:+
在一次和无限次之间,尽可能多次,根据需要回馈[贪心]
\/
字面匹配字符/
tester
字面匹配字符测试器(区分大小写)
如果您要拒绝其中包含(.+)
字面值的ID,请将([^\\/]+)
替换为/
。
答案 3 :(得分:-1)
以下代码可以解决问题。这假设后缀和前缀的其余部分是常量。
Pattern pattern = Pattern.compile("^/pep/v1/clients/(.+)/tester$");
Matcher m = pattern.matcher("/pep/v1/clients/ST-980/tester");
if (m.find()) {
System.out.println("clientId = " + m.group(1));
}