我有一个String s="666788899"
,我需要将其输出为600780090
java中是否可以使用正则表达式来更改这样的字符串。
我使用天真的方法解决了这个问题。实际上,我正在解决一个问题,其中包括带有这样的字符串数组的另一个循环。包括我的内部循环,它上升到O(n ^ 2),这是不可接受的。
int len=str.length();
char c=str.charAt(0);
for(int i=1;i<len;i++)
{
if(str.charAt(i)==c)
{
str.setCharAt(i,'0');
}
else
c=str.charAt(i);
}
输入字符串:
3888667222
输出字符串:
3800607200
答案 0 :(得分:2)
您可以仅使用
(not published)
或者,如果您需要允许匹配的换行符,
$sql = "UPDATE posts SET published = not published WHERE id=$post_id";
请参见regex demo和Java demo online:
.replaceAll("(?<=(.))\\1", "0")
详细信息
.replaceAll("(?s)(?<=(.))\\1", "0")
-System.out.println("666788899".replaceAll("(?<=(.))\\1", "0")); // => 600780090
System.out.println("3888667222".replaceAll("(?<=(.))\\1", "0")); // => 3800607200
嵌入式嵌入标记(?s)
-一个正向后方的视图,其中包含一个与任何字符匹配到第1组的捕获组
Pattern.DOTALL
-内联反向引用,用于匹配并使用下一个与上一个相同的字符。 因此,第一个字符始终保留,而随后的字符被(?<=(.))
替换。
答案 1 :(得分:0)
对于正则表达式选项,您可以尝试使用正式的Java正则表达式模式匹配器:
Pattern pattern = Pattern.compile("(.)\\1+");
Matcher matcher = pattern.matcher("666788899");
StringBuffer buffer = new StringBuffer();
while(matcher.find()) {
String zeroes = matcher.group(0).substring(1).replaceAll(".", "0");
matcher.appendReplacement(buffer, matcher.group(1) + zeroes);
}
matcher.appendTail(buffer);
System.out.println(buffer.toString());
此打印:
600780090
我在这里遵循的一般模式是使用正则表达式回调函数。我们要匹配任何单个数字/字符,然后再匹配一次或多次。然后,在回调中,我们找出在原始初始字符之后需要用多少个零代替。
答案 2 :(得分:0)
您还可以使用余数和除法运算符来完成此操作。但是您仅限于该范围内的数字。
// convert consecutive, duplicate, digits to 0.
public static long convert(long k) {
long n = k % 10;
long sum = 0;
if (k > 0) {
sum = convert(k / 10);
}
if (k % 10 == (k / 10) % 10) {
n = 0;
}
sum = sum * 10 + n;
return sum;
}
这里是一个例子。
long val = 282288829229991333L;
System.out.println(val);
System.out.println(convert(val));
打印
282288829229991333
282080029209001300
这里是仅使用字符数组但不使用正则表达式的方法。而且效率很高。
public static String convert(String a) {
char[] chars = a.toCharArray();
char c = chars[0];
int i = 1;
while (i < chars.length) {
char cc = chars[i];
if (c == cc) {
chars[i] = '0';
}
else {
c = cc;
}
i++;
}
return String.valueOf(chars);
}