java - 如何在每次更改的正则表达式中添加一个字符?
问题描述
String s = scan.nextLine();
s = s.replaceAll(" ", "");
for (int i = 0; i < s.length(); i++) {
System.out.print(s.charAt(i) + "-");
int temp = s.length();
// this line is the problem
s = s.replaceAll("[s.charAt(i)]", '');
System.out.print((temp - s.length()) + "\n");
i = -1;
}
我实际上是使用上述方法来计算每个字符。
我想s.charAt(i)
在正则表达式中使用,以便它计数和显示如下。但是我知道那条线(第 10 行)不起作用。
如果有可能我该怎么做?
例子:
MALAYALAM (input)
M-2
A-4
L-2
Y-1
解决方案
Java 没有字符串插值,所以写在字符串字面量内的代码不会被执行;它只是字符串的一部分。您需要做类似"[" + s.charAt(i) + "]"
的事情来以编程方式构建字符串。
但是当字符是正则表达式特殊字符时,这是有问题的,例如^
。在这种情况下,字符类是[^]
,它绝对匹配任何字符。您可以在构建正则表达式时转义正则表达式特殊字符,但这过于复杂。
由于您只想替换出现的确切子字符串,因此使用replace
不采用正则表达式的方法更简单。不要被名字replace
vs.所迷惑replaceAll
;这两种方法都替换了所有出现的情况,不同之处在于它replaceAll
需要一个正则表达式,但replace
只需要一个精确的子字符串。例如:
> "ababa".replace("a", "")
"bb"
> "ababa".replace("a", "c")
"cbcbc"
推荐阅读
- python - Pandas:如何仅删除列末尾的最后一个连字符
- google-forms - 如何根据其他用户过去的回复使 Google 表单自动填充?
- c - 我知道一个地址,但我应该如何判断在哪个部分?使用C的全局区域或堆区域或堆栈区域
- json - 如何解决“手势 RangeError(索引)捕获的异常:无效值:有效值范围为空:0”
- c++ - 什么会使多边形算法中的点仅在正向和反向运行时才能正常工作?
- php - PHP:如何使用键->值对每两个分隔符将一个字符串分解为一个数组
- kubernetes - 将 GKE 集群拆除为“全新”状态而不删除它?
- scala - Spark——自定义reduce函数保存到磁盘然后上传到s3
- javascript - XMLHttpRequest 返回事件对象而不是实际数据
- fortran - Fortran 将未知大小的文件读入数组