正则表达否定

时间:2013-03-12 21:49:41

标签: java regex

我希望这个正则表达式只产生字符串acl。我怎么做 ?即使我有一个否定运算符,我仍然会得到2013-

void testPattern()
     {
        Pattern pattern =
        Pattern.compile("^.*-");

        Matcher matcher =
        pattern.matcher("2013-acl");

        boolean found = false;
        while (matcher.find())
        {
            println matcher.group();

        }
      }

5 个答案:

答案 0 :(得分:2)

您的模式"^.*-"仅匹配输入,直到连字符。

将其更改为"^.*-(.*)$",而不是matcher.group()使用matcher.group(1)

所以使用这个修改过的模式并使用相同的输入:

  1. ^匹配输入的开头
  2. 首先.*匹配2013
  3. --
  4. 相匹配
  5. 第二个.*匹配acl
  6. $匹配输入的结尾
  7. 第二个.*左右的括号构成一个捕获组。捕获的模式可通过matcher.group(1)获得。

答案 1 :(得分:1)

没有正则表达式的解决方案:

使用StringBuilder删除-之前的所有内容。

String string1 = "2013-acl";
StringBuilder b = new StringBuilder(string1);
b.delete(0, defaultBrowser.lastIndexOf('-') + 1);
string1 = b.toString();
System.out.println(string1);

该程序应打印出acl。不需要正则表达式。

解决方案,如果您需要正则表达式:

String string1 = "2013-acl";
Matcher matcher = Pattern.compile("(?<=-).*$").matcher(string1);
if (matcher.find()) System.out.println(matcher.group());

该程序应打印出acl

答案 2 :(得分:1)

您可以使用它来获取-(?<=-).*$

之后的所有内容

但是,正如已经指出的那样......只需在-上拆分就更容易了。

答案 3 :(得分:0)

^是字符串运算符的开头,而不是否定运算符。

如果您只想匹配我建议使用的结尾:

"-(\w+)"

(不要忘记在Java中逃避斜杠。)

然后检索$1变量中匹配的内容。

您可以使用Matcher.group()功能执行此操作。

Pattern pattern =
Pattern.compile("-(\\w+)");

Matcher matcher =
pattern.matcher("2013-acl");

matcher.find();
println matcher.group(1);

答案 4 :(得分:0)

为什么不将acl作为正则表达式?或acl$如果你只想匹配acl,如果它在字符串的末尾

相关问题