减少激进的惰性通配符
Curtailing Aggressive Lazy Wildcards
我有几个模式可以解析一个简单的文本文件以获取信息,并使用数据构建一个员工对象。有两种类型的员工:全职和小时工。我依靠 Lazy Wildcards 来解析 XML 数据。我的主要问题是 Lazy Wildcard 比预期更具侵略性。 fulltime Pay Record 模式 (patternPRF) Lazy Wildcard 从每小时 payRecord(在 2 处)开始,然后获取所有内容,直到它命中下一个 payRecord。无论如何,我是否可以使用 Wildcard 并说“你做得太过分了”或将其限制在具有所有全职属性(月收入和月工资而不是工资时间和工资率)的员工身上?
待解析的文本文件:
<payRecord id="10">
<EmployeeID>2</EmployeeID> //matcher.group(2) starts here
<PayHours>30</PayHours>
<PayRate>15</PayRate>
</payRecord>
<payRecord id="11">
<EmployeeID>1</EmployeeID>
<MonthlyIncome>3500</MonthlyIncome> //ends here
<NumMonths>8</NumMonths>
</payRecord>
<payRecord id="12">
<EmployeeID>3
</EmployeeeID>
<MonthlyIncome>5000</MonthlyIncome>
<NumMonths>6</NumMonths>
</payRecord>
正则表达式模式:
text = text.replaceAll("\s", ""); //remove all whitespace
//payrecord hourly
patternPRH = Pattern.compile(
"<payRecordid=\"(.*?)\">" //1 id
+ "<EmployeeID>(.*?)</EmployeeID>" //2 EmpID
+ "<PayHours>(.*?)</PayHours>" //3 payHours
+ "<PayRate>(.*?)</PayRate>" //4 payRate
);
//payrecord fulltime
patternPRF = Pattern.compile(
"<payRecordid=\"(.*?)\">"//1 id
+ "<EmployeeID>(.*?)</EmployeeID>"//2 EmployeeID <EmployeeID>2</EmployeeID>
+ "<MonthlyIncome>(.*?)</MonthlyIncome>"//3 MonthlyIncome
+ "<NumMonths>(.*?)</NumMonths>"//4 numMonths
);
附带说明一下,不幸的是,作为 class 要求的一部分,我无法使用任何 XML 解析 classes。
我喜欢负正则表达式。例如 [^"]*
将匹配尽可能多的 不是 引号的字符。
考虑使用类似的东西:
patternPRH = Pattern.compile(
"<payRecordid=\"([^\"]*)\">" //1 id
+ "<EmployeeID>([^<]*)</EmployeeID>" //2 EmpID
+ "<PayHours>([^<]*)</PayHours>" //3 payHours
+ "<PayRate>([^<]*)</PayRate>" //4 payRate
);
为避免这种情况,您可以将匹配限制为
(\d+)
而不是
(.*?)
对于 payRecordId,EmployeeID。
这样做,匹配组将只接受数字,并使您的正则表达式像您一样工作,除了
我有几个模式可以解析一个简单的文本文件以获取信息,并使用数据构建一个员工对象。有两种类型的员工:全职和小时工。我依靠 Lazy Wildcards 来解析 XML 数据。我的主要问题是 Lazy Wildcard 比预期更具侵略性。 fulltime Pay Record 模式 (patternPRF) Lazy Wildcard 从每小时 payRecord(在 2 处)开始,然后获取所有内容,直到它命中下一个 payRecord。无论如何,我是否可以使用 Wildcard 并说“你做得太过分了”或将其限制在具有所有全职属性(月收入和月工资而不是工资时间和工资率)的员工身上?
待解析的文本文件:
<payRecord id="10">
<EmployeeID>2</EmployeeID> //matcher.group(2) starts here
<PayHours>30</PayHours>
<PayRate>15</PayRate>
</payRecord>
<payRecord id="11">
<EmployeeID>1</EmployeeID>
<MonthlyIncome>3500</MonthlyIncome> //ends here
<NumMonths>8</NumMonths>
</payRecord>
<payRecord id="12">
<EmployeeID>3
</EmployeeeID>
<MonthlyIncome>5000</MonthlyIncome>
<NumMonths>6</NumMonths>
</payRecord>
正则表达式模式:
text = text.replaceAll("\s", ""); //remove all whitespace
//payrecord hourly
patternPRH = Pattern.compile(
"<payRecordid=\"(.*?)\">" //1 id
+ "<EmployeeID>(.*?)</EmployeeID>" //2 EmpID
+ "<PayHours>(.*?)</PayHours>" //3 payHours
+ "<PayRate>(.*?)</PayRate>" //4 payRate
);
//payrecord fulltime
patternPRF = Pattern.compile(
"<payRecordid=\"(.*?)\">"//1 id
+ "<EmployeeID>(.*?)</EmployeeID>"//2 EmployeeID <EmployeeID>2</EmployeeID>
+ "<MonthlyIncome>(.*?)</MonthlyIncome>"//3 MonthlyIncome
+ "<NumMonths>(.*?)</NumMonths>"//4 numMonths
);
附带说明一下,不幸的是,作为 class 要求的一部分,我无法使用任何 XML 解析 classes。
我喜欢负正则表达式。例如 [^"]*
将匹配尽可能多的 不是 引号的字符。
考虑使用类似的东西:
patternPRH = Pattern.compile(
"<payRecordid=\"([^\"]*)\">" //1 id
+ "<EmployeeID>([^<]*)</EmployeeID>" //2 EmpID
+ "<PayHours>([^<]*)</PayHours>" //3 payHours
+ "<PayRate>([^<]*)</PayRate>" //4 payRate
);
为避免这种情况,您可以将匹配限制为
(\d+)
而不是
(.*?)
对于 payRecordId,EmployeeID。
这样做,匹配组将只接受数字,并使您的正则表达式像您一样工作,除了