【发布时间】:2019-09-24 15:29:50
【问题描述】:
我想写一个方法来解析包含人名和年龄的字符串。例如:
Manuel 8
Mustafa 16
Zhihao 12
Itsuki 12
Louis 11
Farah 11
即字符串的规格为%N %A,其中%N代表姓名,%A代表年龄。
但是,字符串的规范不是固定的(例如,它可能是另一个文档中的%N age:%A 或%N (%A)),因此解析方法应该能够将规范作为其参数之一。
换句话说,解析方法应该是这样工作的:
Data d1 = Parser.parse("Indira 15", "%N %A");
Data d2 = Parser.parse("12 Shu-chen", "%A %N");
Data d3 = Parser.parse("Hana (12)", "%N (%A)");
Data d4 = Parser.parse("Name: Sophia [12]", "Name: %N [%A]");
Data 和 Parser 的定义如下:
public class Data {
private String name;
private int age;
public Data(String name, int age) {
this.name = name;
this.age = age;
}
// + getter and setter methods.
}
public class Parser {
public static Data parse(String s, String specification) {
// --- What to do here? ---
return (new Data(name, age));
}
}
Parser.parse怎么写?换句话说,如何使用字符串规范来解析字符串?
【问题讨论】:
-
关键字:
Regular Expression -
@RickyMo 是的,我知道如何使用正则表达式解析具有固定规范的字符串,但我不确定如何解析具有可变规范的字符串。
-
您可以使用捕获组来捕获变量。对
%N使用(.+),对%A使用([0-9]+),并在Java 中使用Matcher.group()检索捕获的组。正则表达式示例:https://regexr.com/4dgev。但是,您可能需要进行额外的分析,以确定是年龄优先还是姓名优先。 -
这就是你的意思:“规范”字面意思说明了格式,只有
%N和%A表示姓名/年龄?然后做到这一点:从specification中形成正则表达式,在其中将%N替换为([\w-']+)(添加名称中可能包含的任何其他内容,或使用[^0-9]+)和%A与([0-9]+).然后,当您将s与此匹配时,您将获得姓名和年龄。要查看哪个是哪个,请再次参考您的规范(%N或%A是第一个吗?)。
标签: java regex parsing regex-group regex-greedy