如何使用正则表达式找到两个\ n之间的子字符串?

时间:2013-10-14 20:51:52

标签: java regex

我需要在以下字符串中找到一个人的姓名:

 TI35635: 71-3463463409 wa36ued i56tle Ro356 IL
    Involved Subject
     Name: PETER SMITH
     Address: 1 MAIN AVE

所以,我应遵循的规则如下:子字符串是whatevet紧跟在“Subject \ n + Name:”之后和“hits \ n”之前我必须遵循这个规则,因为原来的一些单词我没有发布的字符串(太长)不能是唯一的

我尝试了以下内容:

Pattern patternName = Pattern.compile("(?:Subject.?)(\\n)(Name:.*?)\\n", Pattern.DOTALL);
Matcher matcherName = patternName.matcher(text);
matcherName.find();

请帮我纠正

5 个答案:

答案 0 :(得分:1)

您的示例有3个组a.e O(n^3),其中n是字符编号。

如果我们想要多次替换,一般正则表达式是好的。

在你的情况下,正则表达式太贵了。 (从我看来)。我将使用以下示例:

String str = "TI35635: 71-3463463409 wa36ued i56tle Ro356 IL\r\n" + 
                "    Involved Subject\r\n" + 
                "     Name: PETER SMITH\r\n" + 
                "     Address: 1 MAIN AVE";

    StringBuilder buff = new StringBuilder();

    for(String line : str.split(System.getProperty("line.separator"))){
        if(line.contains("Name: ")){
            String temp = line.split(": ")[0];
            temp = temp + ": " + "New Name"; 
            buff.append(temp).append("\n");
        }
        else{
            buff.append(line).append("\n");
        }           
    }       

    System.out.println(buff.toString());

输出:

TI35635: 71-3463463409 wa36ued i56tle Ro356 IL
    Involved Subject
     Name: New Name
     Address: 1 MAIN AVE

答案 1 :(得分:1)

您可以将名称代表正则表达式:

([ \\t\\x0B\\f\\r]*[a-zA-Z]+)*

这表示以下零个或多个序列:零个或多个空格(非换行符),后跟一个或多个字母。应该处理较大的正则表达式中的名称。

或者,\ s表示空格(虽然它包含换行符),\ w表示任何字母或数字字符。

答案 2 :(得分:1)

在尝试匹配包含该名称的组之前,请跳过空格。您可以使用\s,它不仅匹配空格,还会添加换行符

Pattern patternName = 
           Pattern.compile("(?:Subject.?)\\s+(Name:.*?)\\n", Pattern.DOTALL);

小组1包含:

Name: PETER SMITH

阅读Pattern javadoc以获取与\s

匹配的完整字符列表

答案 3 :(得分:1)

您可以尝试使用正则表达式:

Subject[ ]*\r?\n[ ]*(Name:.*)

e.g:

private static final Pattern REGEX_PATTERN = 
        Pattern.compile("Subject[ ]*\\r?\\n[ ]*(Name:.*)");

public static void main(String[] args) {
    String input = "TI35635: 71-3463463409 wa36ued i56tle Ro356 IL\n    Involved Subject\n     Name: PETER SMITH\n     Address: 1 MAIN AVE";

    Matcher matcher = REGEX_PATTERN.matcher(input);
    while (matcher.find(1)) {
        System.out.println(matcher.group());
    }
}

输出:

Name: PETER SMITH

答案 4 :(得分:1)

你可以只用一行:

String name = str.replaceAll("(?sm).*Subject\\s+Name:(.*?)?$.*", "$1");

如果找不到名称,结果将为空白。

我也做到了,所以它也适用于Windows文件。


这是一些测试代码:

String str = " TI35635: 71-3463463409 wa36ued i56tle Ro356 IL\n    Involved Subject\n     Name: PETER SMITH\n     Address: 1 MAIN AVE";
String name = str.replaceAll("(?sm).*Subject\s+Name:(.*?)?$.*", "$1");
System.out.println("Name = " + name);;

输出:

Name = PETER SMITH