Java 正则表达式 (java.util.regex)。搜索美元符号

Java regex (java.util.regex). Search for dollar sign

我有一个搜索字符串。 当它包含美元符号时,我想捕获其后的所有字符,但不包括点或随后的美元符号。后者将构成后续匹配。 所以对于这些搜索字符串中的任何一个......:

"/bla/$V_N.$XYZ.bla";
"/bla/$V_N.$XYZ;

我想 return:

如果搜索字符串包含百分号,我还想return这对 % 符号之间是什么。

下面的正则表达式似乎可以解决这个问题。

 "%([^%]*?)%";

推断:

有些语言允许 %1%2 用于捕获组,而 Java 使用 backslash\number 语法。所以,这个字符串编译并生成输出。

我怀疑美元符号和点需要转义,因为它们是特殊符号:

我试过使用双反斜杠符号.. \

试图结合这个逻辑,似乎无法得到任何发挥作用。

不知有没有一双眼睛可以看到如何解决这个难题!

我目前的尝试:

import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
class Main {
  public static void main(String[] args) {
        String search = "/bla/$V_N.$XYZ.bla";
        String pattern = "([%\$])([^%\.\$]*?)\1?";
  /* Either % or $ in first capture group ([%\$])
   * Second capture group - anything except %, dot or dollar sign
   * non greedy group ( *?)
   * then a backreference to an optional first capture group \1?
   * Have to use two \, since you escape \ in a Java string.
   */
        Pattern r = Pattern.compile(pattern);
        Matcher m = r.matcher(search);
        List<String> results = new ArrayList<String>();
          while (m.find()) 
        { 
          for (int i = 0; i<= m.groupCount(); i++) {
                results.add(m.group(i));
          }
        }
        for (String result : results) {
          System.out.println(result);
        }
  }
}

以下链接可能会有帮助:

您可以使用

String search = "/bla/$V_N.$XYZ.bla";
String pattern = "[%$]([^%.$]*)";
Matcher matcher = Pattern.compile(pattern).matcher(search);
while (matcher.find()){
    System.out.println(matcher.group(1)); 
} // => V_N, XYZ

参见Java demo and the regex demo

注意

  • 模式末尾不需要可选的 ?。因为它是可选的,所以它不限制匹配上下文并且是多余的(因为否定字符 class 既不能匹配 $ 也不能匹配 %
  • [%$]([^%.$]*) 匹配 %$,然后将任何零个或多个捕获到第 1 组 %.$ 以外的字符。您只需要第 1 组值,因此使用 matcher.group(1)
  • character class中,.$都不是特殊的,因此在[%.$][%$]中不需要转义。