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

标签 java regex special-characters dollar-sign

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

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

我想返回:

  • V_N
  • XYZ

如果搜索字符串包含百分号,我还想返回一对 % 符号之间的内容。

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

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

推断:

  • 以%开头和结尾,
  • 有一个捕获组 - ()
  • 有一个包含除 % 符号之外的任何内容的字符类,(脱字符号表示不是字符)
  • 重复 - 但不是贪婪*?

某些语言允许使用%1%2作为捕获组,而Java则使用反斜杠\数字语法。因此,该字符串编译并生成输出。

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

  • $ 通常是字符串结尾
  • . 是任何字符的元序列。

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

  • 两者都是字符类。 [^\\.\\$%]
  • 并使用OR'd表示法%|\\$

试图将这种逻辑结合起来,但似乎无法发挥任何作用。

我想知道是否有另一双眼睛可以看到如何解决这个难题!

到目前为止我的尝试:

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 demoregex demo .

注意

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

关于Java 正则表达式 (java.util.regex)。搜索美元符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58821727/

相关文章:

java - EXcel 表 POI 验证 : Out Of Memory Error

java - 字节缓冲区内存分配

python - pandas 数据帧上的正则表达式更改列名称,然后重新排列数据帧的格式

javascript - 使用javascript正则表达式从字符串中获取除连字符和括号之外的所有字符

java - 电子邮件地址中的方括号字符

sql - PL/SQL 在多个列和表中查找特殊字符

sql-server - sql server认为空字符串等于一些字符

java - 如何使 Web 服务 URL 在远程计算机上工作?

JAVA:计算二维光束武器的推力

html - sed:使用正则表达式去掉 <img ...> 部分