[英]How to find the words starting after line breaks, using regex, Java?
我有一个输入字符串,由几行组成,例如:
When I was younger
I never needed
And I was always OK
but it was a long Time Ago
问题是反转所有长度大于 3 的单词的第一个字母。即 output 必须如下:
when I Was Younger
I Never Needed
and I Was Always OK
But it Was a Long time ago
有我的代码:
import java.util.regex.*;
public class Part3_1 {
public static void main(String[] args) {
String str = "When I was younger\r\nI never needed\r\nAnd I was always OK\r\nbut it was a long Time Ago";
System.out.println(convert(str));
}
public static String convert(String str) {
String result = "";
String[] strings = str.split(" ");
String regexLowerCase = "\\b[a-z]{3,}\\b";
String regexLowerCaseInitial = "(\\r\\n)[a-z]{3,}\\b";
String regexUpperCase = "\\b([A-Z][a-z]{2,})+\\b";
String regexUpperCaseInitial = "(\\r\\n)([A-Z][a-z]{2,})\\b";
Pattern patternLowerCase = Pattern.compile(regexLowerCase, Pattern.MULTILINE);
Pattern patternUpperCase = Pattern.compile(regexUpperCase, Pattern.MULTILINE);
Pattern patternLowerCaseInitial = Pattern.compile(regexLowerCaseInitial, Pattern.MULTILINE);
Pattern patternUpperCaseInitial = Pattern.compile(regexUpperCaseInitial, Pattern.MULTILINE);
for (int i = 0; i < strings.length; i++) {
Matcher matcherLowerCase = patternLowerCase.matcher(strings[i]);
Matcher matcherUpperCase = patternUpperCase.matcher(strings[i]);
Matcher matcherLowerCaseInitial = patternLowerCaseInitial.matcher(strings[i]);
Matcher matcherUpperCaseInitial = patternUpperCaseInitial.matcher(strings[i]);
char[] words = strings[i].toCharArray();
if (matcherLowerCase.find() || matcherLowerCaseInitial.find()) {
char temp = Character.toUpperCase(words[0]);
words[0] = temp;
result += new String(words);
} else if (matcherUpperCase.find() || matcherUpperCaseInitial.find()) {
char temp = Character.toLowerCase(words[0]);
words[0] = temp;
result += new String(words);
} else {
result += new String(words);
}
if (i < strings.length - 1) {
result += " ";
}
}
return result;
}
}
这里:
"\\b[az]{3,}\\b"
是一个正则表达式,选择所有长度为3个或更多符号的小写单词,"\\b([AZ][az]{2,})+\\b"
是一个正则表达式,选择所有从大写字母开始长度为3个或更多符号的单词。两个正则表达式都可以正常工作,但是当我们有换行符时 - 它们不起作用。 我的程序执行的output如下:
when I Was Younger
I Never Needed
And I Was Always OK
but it Was a Long Time ago
据我了解,这些正则表达式不能 select 单词And
and but
来自needed\r\nAnd
和OK\r\nbut
分别。
为了修复这个错误,我尝试添加新的正则表达式"(\\r\\n)[az]{3,}\\b"
和"(\\r\\n)([AZ][az]{2,})\\b"
,但它们不起作用。
如何编写正则表达式,在换行后选择单词?
一种选择是在分词符( \b
)上拆分字符串,然后将空格传递给strings
数组中的最终字符串。 这消除了为不同情况使用单独的正则表达式的需要,也不需要添加退格字符。 这将为您提供所需的结果:
public static String convert(String str) {
String result = "";
String[] strings = str.split("\\b");
String regexLowerCase = "^[a-z]{3,}";
String regexUpperCase = "^[A-Z][a-z]{2,}+";
Pattern patternLowerCase = Pattern.compile(regexLowerCase, Pattern.MULTILINE);
Pattern patternUpperCase = Pattern.compile(regexUpperCase, Pattern.MULTILINE);
for (int i = 0; i < strings.length; i++) {
Matcher matcherLowerCase = patternLowerCase.matcher(strings[i]);
Matcher matcherUpperCase = patternUpperCase.matcher(strings[i]);
char[] words = strings[i].toCharArray();
if (matcherLowerCase.find()) {
char temp = Character.toUpperCase(words[0]);
words[0] = temp;
result += new String(words);
} else if (matcherUpperCase.find()) {
char temp = Character.toLowerCase(words[0]);
words[0] = temp;
result += new String(words);
} else {
result += new String(words);
}
}
return result;
}
Output:
when I Was Younger
I Never Needed
and I Was Always OK
But it Was a Long time ago
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.