繁体   English   中英

如何使用正则表达式 Java 找到换行后开始的单词?

[英]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\nAndOK\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

rextester 上的演示

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM