Java 除第一个外的正则表达式

Java 除第一个外的正则表达式,java,regex,Java,Regex,嗨,我有这样的字符串: %a%%%%%bc%%%d% a%bc%d Pattern p = Pattern.compile("%([^%]+%)%*([^%]*%)%*([^%]+)%"); Matcher m = p.matcher(input); if(m.matches()) { System.out.println(m.group(1) + m.group(2) + m.group(3)); } else { System.err.println("The patte

嗨,我有这样的字符串:

%a%%%%%bc%%%d%
a%bc%d
Pattern p = Pattern.compile("%([^%]+%)%*([^%]*%)%*([^%]+)%");
Matcher m = p.matcher(input);
if(m.matches()) {
    System.out.println(m.group(1) + m.group(2) + m.group(3));
} else {
    System.err.println("The pattern didn't match");
}
我需要将字符串开头和结尾的第一个%和最后一个%替换为“”。 我还需要替换所有的%+,除了每个字符串序列组的第一个%+

结果应该是这样的:

%a%%%%%bc%%%d%
a%bc%d
Pattern p = Pattern.compile("%([^%]+%)%*([^%]*%)%*([^%]+)%");
Matcher m = p.matcher(input);
if(m.matches()) {
    System.out.println(m.group(1) + m.group(2) + m.group(3));
} else {
    System.err.println("The pattern didn't match");
}
我如何处理正则表达式?我试过这样的方法:
*?%(\W+)%
,但没有成功

谢谢。

您可以使用

.replaceAll("^%|%$|(%)+", "$1")

详细信息

  • ^%
    -字符串开头的
    %
    匹配
  • |
    -或
  • %$
    -字符串末尾的
    %
  • |
    -或
  • (%)++
    -一个重复的捕获组,它匹配1+
    %
    符号,但在每次迭代到组1时只捕获一个
    %
    ,之后,对该组的
    $1
    反向引用将多个
    %
    字符替换为1个
    %

    • Wiktor的解决方案很好。但是,如果您需要知道输入是否与模式匹配,您可能希望尝试以下解决方案:

      %a%%%%%bc%%%d%
      
      a%bc%d
      
      Pattern p = Pattern.compile("%([^%]+%)%*([^%]*%)%*([^%]+)%");
      Matcher m = p.matcher(input);
      if(m.matches()) {
          System.out.println(m.group(1) + m.group(2) + m.group(3));
      } else {
          System.err.println("The pattern didn't match");
      }
      

      请提供更多信息。你的字符串是完整的还是会在一段较长的时间内出现,在之前和/或之后?