java - 当相同的正则表达式在 shell 中工作时,Java 中的正则表达式不起作用

标签 java regex shell

我想用 ${variable}$ 替换所有 :variable(以 : 开头的单词)。

例如,

  • :aks_num${aks_num}$

  • :brn_num${brn_num}$

以下是我的代码,它不起作用:

public static void main(String[] argv) throws Exception 
{
    CharSequence chSeq = "AND ((:aks_num = -1) OR (aks_num = :aks_num AND ((:brn_num = -1) OR (brn_num = :brn_num))))";

    // replaceAll also not working
    //String s = chSeq.replaceAll(":\\([a-z_]*\\)","\\${ $1 \\}$");

    Pattern p = Pattern.compile(":\\([a-z_]*\\)");
    Matcher m = p.matcher(chSeq);

    if (m.find()) {
         System.out.println("Found value: " + m.group(0) );
         System.out.println("Found value: " + m.group(1) );
         System.out.println("Found value: " + m.group(2) );
      } else {
         System.out.println("NO MATCH");
      }
}

在 shell 脚本中,以下正则表达式完美运行:

s/:\([a-z_]*\)/${\1}$/g

最佳答案

:\\([a-z_]*\\)(带转义括号)表示您要匹配 :(aks_num) 之类的表达式。显然,输入字符串中没有这样的表达式。这解释了为什么没有匹配项。

相反,如果您想使用括号来捕获某些变量,则不应转义括号。

示例:

CharSequence chSeq = "AND ((:aks_num = -1) OR (aks_num = :aks_num AND ((:brn_num = -1) OR (brn_num = :brn_num))))";
Pattern p = Pattern.compile(":([a-z_]*)");
Matcher m = p.matcher(chSeq);

while (m.find()) {
  System.out.println("Found value: " + m.group(0)+". Captured : "+m.group(1));
}

输出:

Found value: :aks_num. Captured : aks_num
Found value: :aks_num. Captured : aks_num
Found value: :brn_num. Captured : brn_num
Found value: :brn_num. Captured : brn_num

关于java - 当相同的正则表达式在 shell 中工作时,Java 中的正则表达式不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36547324/

相关文章:

java - 如何在 Tomcat 日志文件夹中打印日志

python - 正则表达式查找带有下划线和可选扩展名的文件

c - C-如何解析反斜杠字符

sql - PostgreSQL : How to select values with only two digits after decimal point in a table?

linux - 如何让这个 init.d 脚本在服务器重启时启动?

linux - 使用 cat 和 tee 添加文件时的奇怪行为

java - 如何创建一个 void 函数来列出 13 号下一个 13 星期五

java - 当 url 不变时,使用 Java Selenium 跨多个页面抓取数据

java - 管理线程的顺序

c# - 解析器识别正则表达式时出错