Java 将字符与正则表达式匹配
我想复制字符串中的所有辅音字符。例如:Java 将字符与正则表达式匹配,java,regex,Java,Regex,我想复制字符串中的所有辅音字符。例如: Hello, how do you do? 将成为: HHellllo, hhoww ddo yyouu ddo? 到目前为止,这是我想到的 char[] charArray = "Hello, how do you do?".toCharArray(); String pattern = "[BbCcDdFfGgHhJjKkLlMmNnPpQqRrSsTtVvWwXxZz]"; StringBuffer sb = new StringBuffer()
Hello, how do you do?
将成为:
HHellllo, hhoww ddo yyouu ddo?
到目前为止,这是我想到的
char[] charArray = "Hello, how do you do?".toCharArray();
String pattern = "[BbCcDdFfGgHhJjKkLlMmNnPpQqRrSsTtVvWwXxZz]";
StringBuffer sb = new StringBuffer();
for(char c : charArray){
String theChar = "" + c;
if(theChar.matches(pattern)){
sb.append(c);
}
sb.append(c);
}
System.out.println(sb.toString());
它是有效的,但我相信有更好的方法来使用正则表达式。每次我需要使用匹配项()
时,我觉得为每个字符创建一个字符串效率不高,您可以将当前正则表达式和“$0$0”
用作替换,以复制所有匹配项(每个匹配项将是一个字符):
在替换字符串中,$0
是对整个匹配的引用,如果您有捕获组,则可以使用$1
、$2
等来引用关联的捕获组。以下页面提供了一些有关在Java中使用正则表达式的附加信息:请注意,您还可以稍微缩短正则表达式,Casimir的答案有一个很好的方法,下面是另一个:
String pattern = "(?i)(?![aeiou])[a-z]";
这是因为
(?![aeiou])
是一个负前瞻,表示“如果下一个字符是元音,则失败”,因此即使[a-z]
将匹配包括元音在内的任何小写字符,此正则表达式仍将仅匹配辅音。开头的(?i)
使正则表达式不区分大小写。String
类有一个内置的方法,replaceAll()
,用于这种情况
String sb = input.replaceAll("([BbCcDd...])", "$1$1");
$1
表示“模式中括号中的任何内容”。您可以使用类交集
String result = text.replaceAll("(?i)[b-z&&[^eiouy]]" , "$0$0");
小细节,但原始代码似乎考虑了<代码> y>代码>元音。它也将受益,0美元0美元是如何工作的。对我来说,这是一种魔力。任何文件/参考资料都会有所帮助。这种行为在所有语言中都有效吗?我喜欢使用正则表达式的备忘单,因为我不能记住它们或使用上下文线索来找出它们@谢谢你的链接。我已经去过那么大的地方很多次了,从来没有注意到:)它工作得很好。我希望第二个字符总是小写,并且$0\L$0不起作用(转义序列无效)。还有其他方法可以这样做吗?我不认为你可以用
replaceAll
来做,你需要迭代匹配。在从我的问题到“使用Matcher类”部分底部的链接中,有一段代码可能是一个很好的起点,使用Matcher的appendReplacement
方法。
String result = text.replaceAll("(?i)[b-z&&[^eiouy]]" , "$0$0");