我的字符串为"process_client_123_Tree"
和"process_abc_pqr_client_123_Tree"
。我想在"process_client_"
和"process_abc_pqr_client_"
之后提取所有内容并将其存储在String变量中。
此处currentKey
变量可以包含以上两个字符串中的任何一个。
String clientId = // how to use currentKey here so that I can get remaining portion in this variable
这样做的正确方法是什么?我应该在这里使用split还是使用一些正则表达式?
答案 0 :(得分:1)
import java.util.regex.*;
class test
{
public static void main(String args[])
{
Pattern pattern=Pattern.compile("^process_(client_|abc_pqr_client_)(.*)$");
Matcher matcher = pattern.matcher("process_client_123_Tree");
while(matcher.find())
System.out.println("String 1 Group 2: "+matcher.group(2));
matcher = pattern.matcher("process_abc_pqr_client_123_Tree");
while(matcher.find())
System.out.println("String 2 Group 2: "+matcher.group(2));
System.out.println("Another way..");
System.out.println("String 1 Group 2: "+"process_client_123_Tree".replace("process_client_", ""));
System.out.println("String 2 Group 2: "+"process_abc_pqr_client_123_Tree".replace("process_abc_pqr_client_", ""));
}
}
输出:
$ java test
String 1 Group 2: 123_Tree
String 2 Group 2: 123_Tree
Another way..
String 1 Group 2: 123_Tree
String 2 Group 2: 123_Tree
正则表达式分手:
^匹配行的开头
process_(client_ | abc_pqr_client_)匹配“process_”后跟“client_”或abc_pqr_client_“(作为组1捕获)
(。*)$。表示任何char和*表示0次或更多次,因此它匹配字符串中的其余字符直到结束($)并将其捕获为组2
答案 1 :(得分:1)
123_Tree
获取你:
mov ebx,first ;move first into ebx
mov second,ebx ;copy ebx to second [NOW second=first]
正则表达式中的括号定义匹配组。管道是合乎逻辑的或。点表示任何字符和星号表示任何数字。因此,我使用该正则表达式创建一个模式对象,然后使用匹配器对象来获取已匹配的字符串部分。
答案 2 :(得分:1)
正则表达式可以是:"process_(?:abc_pqr_)?client_(\\w+)"
regex101 demo
(?:abc_pqr_)?
是optional部分(?:
打开non capture group )?
零次或一次\w+
匹配一个或多个word characters [A-Za-z0-9_]
Demo at RegexPlanet。匹配将在group(1)
/ first capturing group。
要将其限制为右侧,请将lazily与正确的令牌匹配
"process_(?:abc_pqr_)?client_(\\w+?)_trace_count"
其中\w+?
匹配尽可能少的单词字符以满足条件。