使用正则表达式捕获预期结果

时间:2014-01-26 13:19:21

标签: java regex regex-group

我正在寻找带有捕获组的正则表达式,其中问号(?)可以出现在我的输入字符串中。如果它不存在,则按原样返回输入字符串,但如果存在?,则在第一次出现?之前返回字符串。

我的输入可以采用以下格式

Pattern 1
abc.txt // result should be abc.txt
Pattern 2
abc.txt?param1=qwerty.controller&param2=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是空字符串,我可以知道输入字符串不包含任何内容吗?输入字符串是这里的预期输出。但我正在寻找是否可以用单一正则表达式捕获这两种模式?

3 个答案:

答案 0 :(得分:1)

一种方法是从第一个问号开始删除字符串中的所有内容,如下所示:

String res = orig.replaceAll("[?].*$", "");

如果没有问号,表达式将不匹配,因此您将获得原始字符串。否则,表达式将匹配从问号开始的所有内容,因此replaceAll将删除它,因为替换字符串为空。

String orig = "abc.txt?param1=qwerty.controller&param2=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

Link to a demo on ideone.

编辑:我想用一个正则表达式捕获两者

您可以将"^[^?]*"用于正则表达式。 ^锚定到开头,而[^?]捕获所有内容 - 直到字符串的末尾,或者直到第一个问号。无论哪种方式,问号都会被遗漏。

以下是代码:

String[] strings = new String[] {"abc.txt?param1=qwerty.controller&param2=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);
}

Second demo on ideone.

答案 1 :(得分:1)

替换第一个?及其后的所有内容(如果存在):

str = str.replaceAll("\\?.*", "");

答案 2 :(得分:1)

你可以使用这样一个否定的类:

^[^?]+

regex101 demo

^首先确保比赛从头开始。

[^?]+匹配所有非?个字符(如果没有,则匹配到最后)。

相关问题