Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将字符与正则表达式匹配_Java_Regex - Fatal编程技术网

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");