我查看了现有的主题,但我的任务与论坛上的略有不同。我有价值:
int j = 37;
我有一根弦:
1) String s1 = "5+2+5+2 --j *2*7+3";
2) String s1 = "5+2+5+2 j-- *2*7+3";
3) String s1 = "5+2+5+2 ++j *2*7+3";
4) String s1 = "5+2+5+2 j++ *2*7+3";
我需要正则表达式 --j
, j--
, ++j
, j++
并将字符串中出现的子字符串替换为数值 j
;
结果字符串必须如下所示:
1) 5+2+5+2 36 *2*7+3
2) 5+2+5+2 36 *2*7+3
3) 5+2+5+2 38 *2*7+3
4) 5+2+5+2 38 *2*7+3
带图案 str.split(search).join(replacement)
我可以替换字符 j
带编号 37
:
str.split("j").join(37);
然后我得到:
1) String s1 = "5+2+5+2 --37 *2*7+3";
2) String s1 = "5+2+5+2 37-- *2*7+3";
3) String s1 = "5+2+5+2 ++37 *2*7+3";
4) String s1 = "5+2+5+2 37++ *2*7+3";
问题:
但是如何进行算术运算呢( increment
, decrement
)在这个时候?
4条答案
按热度按时间rbl8hiat1#
注意,在这个问题中,操作并不遵循java行为,即pre-increment和postincrement的行为都类似于preincrement。
要实现此行为,我们需要两个正则表达式:
一个表达式匹配所有表达式
--j
以及j--
将它们替换为j - 1
:[-]{2}j|j[-]{2}
regex101演示一个表达式匹配所有表达式
++j
以及j++
将它们替换为j + 1
:[+]{2}j|j[+]{2}
regex101演示综合起来,我们可以写出以下方法:
ideone演示
此实现假定
j
前缀或后缀为++
或者--
. 而且,因为我们从未真正改变j
,在单个String
会导致意想不到的行为。如果我们想模仿java行为(即区分pre-increment和post-increment),我们需要三个不同的正则表达式,因为我们必须替换
j
有三个不同的值:要替换的正则表达式
j(++|--)
原值为j
:j(?:[+]{2}|[-]{2})
regex101演示要替换的正则表达式
++j
有价值的j + 1
:[+]{2}j
regex101演示要替换的正则表达式
--j
有价值的j - 1
:[-]{2}j
regex101演示综合起来,我们可以编写以下java方法:
ideone演示
此解决方案与第一个解决方案具有相同的限制。
hxzsmxv22#
oxcyiej73#
String.replaceAll
可按如下方式使用:提供预期输出:
mzsu5hc04#
你可以使用一系列
if
语句,使用contains()
然后用相应的值替换图案: