1

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

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

请帮我改正

4

5 回答 5

1

您的示例有 3 个组 ae 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
于 2013-10-14T20:55:54.627 回答
1

您可以将名称的正则表达式表示为:

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

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

或者,\s 代表空格(尽管它包括换行符),\w 代表任何字母或数字字符。

于 2013-10-14T20:57:13.570 回答
1

在尝试匹配包含名称的组之前跳过空格。您可以使用\swhich 不仅可以匹配空格,还可以匹配换行符

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

1包含:

Name: PETER SMITH

阅读Pattern javadoc以获取匹配的字符的完整列表\s

于 2013-10-14T21:09:43.297 回答
1

你可以试试正则表达式:

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

例如:

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
于 2013-10-14T21:13:05.600 回答
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
于 2013-10-14T21:27:34.577 回答