我需要在以下字符串中找到一个人的姓名:
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();
请帮我纠正
答案 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