我正在寻找带有捕获组的正则表达式,其中问号(?)可以出现在我的输入字符串中。如果它不存在,则按原样返回输入字符串,但如果存在?
,则在第一次出现?
之前返回字符串。
我的输入可以采用以下格式
Pattern 1
abc.txt // result should be abc.txt
Pattern 2
abc.txt?param1=qwerty.controller¶m2=xsd.txt // result should be abc.txt
我在下面试过
Matcher matcher = Pattern.compile("(.*?)\\?").matcher(str1);
String group1 = "";
if (matcher.find()) {
group1 = matcher.group();
}
有了这个,我能够捕获模式2的预期结果,但我不知道如何修改它以便我可以 捕获模式1和模式2的预期结果。
更新: - 我知道如果group1是空字符串,我可以知道输入字符串不包含任何内容吗?输入字符串是这里的预期输出。但我正在寻找是否可以用单一正则表达式捕获这两种模式?
答案 0 :(得分:1)
一种方法是从第一个问号开始删除字符串中的所有内容,如下所示:
String res = orig.replaceAll("[?].*$", "");
如果没有问号,表达式将不匹配,因此您将获得原始字符串。否则,表达式将匹配从问号开始的所有内容,因此replaceAll
将删除它,因为替换字符串为空。
String orig = "abc.txt?param1=qwerty.controller¶m2=xs?d.txt";
String res = orig.replaceAll("[?].*$", "");
System.out.println(res);
orig = "hello world";
res = orig.replaceAll("[?].*$", "");
System.out.println(res);
打印
abc.txt
hello world
编辑:我想用一个正则表达式捕获两者
您可以将"^[^?]*"
用于正则表达式。 ^
锚定到开头,而[^?]
捕获所有内容 - 直到字符串的末尾,或者直到第一个问号。无论哪种方式,问号都会被遗漏。
以下是代码:
String[] strings = new String[] {"abc.txt?param1=qwerty.controller¶m2=xs?d.txt", "Hello, world!", "a?b"};
for (String str1 : strings) {
Matcher matcher = Pattern.compile("^[^?]*").matcher(str1);
String group1 = "";
if (matcher.find()) {
group1 = matcher.group();
}
System.out.println(group1);
}
答案 1 :(得分:1)
替换第一个?
及其后的所有内容(如果存在):
str = str.replaceAll("\\?.*", "");
答案 2 :(得分:1)