rho*_*ron 4 java regex variables
我有一个变量v,可能在一个字符串中连续出现多次.我想做到这一点,所有连续的v s变成只有一个v.例如:
String s = "Hello, world!";
String v = "l";
Run Code Online (Sandbox Code Playgroud)
正则表达式会变成"Hello,world!" 进入"Helo,世界!"
所以我想做点什么
s = s.replaceAll(vv+, v)
Run Code Online (Sandbox Code Playgroud)
但显然这不起作用.思考?
pol*_*nts 17
让我们迭代地开发解决方案; 在每一步中,我们都会指出问题是什么,并在我们得出最终答案之前将其修复.
我们可以从这样的事情开始:
String s = "What???? Impo$$ible!!!";
String v = "!";
s = s.replaceAll(v + "{2,}", v);
System.out.println(s);
// "What???? Impo$$ible!"
Run Code Online (Sandbox Code Playgroud)
{2,} 是有限重复的正则表达式语法,在这种情况下意味着"至少2".
它恰好发生在上面,因为!它不是一个正则表达式元字符.让我们看看如果我们尝试以下内容会发生什么:
String v = "?";
s = s.replaceAll(v + "{2,}", v);
// Exception in thread "main" java.util.regex.PatternSyntaxException:
// Dangling meta character '?'
Run Code Online (Sandbox Code Playgroud)
解决该问题的方法之一是使用Pattern.quote,这样v是从字面上:
s = s.replaceAll(Pattern.quote(v) + "{2,}", v);
System.out.println(s);
// "What? Impo$$ible!!!"
Run Code Online (Sandbox Code Playgroud)
事实证明,这不是我们需要担心的唯一的事情:在替换字符串,\以及$一些特殊的元字符.这就解释了为什么我们会遇到以下问题:
String v = "$";
s = s.replaceAll(Pattern.quote(v) + "{2,}", v);
// Exception in thread "main" java.lang.StringIndexOutOfBoundsException:
// String index out of range: 1
Run Code Online (Sandbox Code Playgroud)
由于我们希望v将字面意思视为替换字符串,因此我们使用Matcher.quoteReplacement如下:
s = s.replaceAll(Pattern.quote(v) + "{2,}", Matcher.quoteReplacement(v));
System.out.println(s);
// "What???? Impo$ible!!!"
Run Code Online (Sandbox Code Playgroud)
最后,重复的优先级高于连接.这意味着以下内容:
System.out.println( "hahaha".matches("ha{3}") ); // false
System.out.println( "haaa".matches("ha{3}") ); // true
System.out.println( "hahaha".matches("(ha){3}") ); // true
Run Code Online (Sandbox Code Playgroud)
因此,如果v可以包含多个字符,则需要在应用重复之前对其进行分组.在这种情况下,您可以使用非捕获组,因为您不需要创建反向引用.
String s = "well, well, well, look who's here...";
String v = "well, ";
s = s.replaceAll("(?:" +Pattern.quote(v)+ "){2,}", Matcher.quoteReplacement(v));
System.out.println(s);
// "well, look who's here..."
Run Code Online (Sandbox Code Playgroud)
Pattern.quoteMatcher.quoteReplacement以下示例使用不情愿的重复,捕获组和反向引用以及不区分大小写的匹配:
System.out.println(
"omgomgOMGOMG???? Yes we can! YES WE CAN! GOAAALLLL!!!!"
.replaceAll("(?i)(.+?)\\1+", "$1")
);
// "omg? Yes we can! GOAL!"
Run Code Online (Sandbox Code Playgroud)
使用x{2,}匹配x至少两次.
为了能够替换regexp具有特殊含义的字符,您可以使用Pattern.quote:
String part = Pattern.quote(v);
s = s.replaceAll(part + "{2,}", v);
Run Code Online (Sandbox Code Playgroud)
要替换长于一个字符的内容,请使用非捕获组:
String part = "(?:" + Pattern.quote(v) + ")";
s = s.replaceAll(part + "{2,}", v);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
11717 次 |
| 最近记录: |