我想用 ${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/