首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >减少激进的懒散通配符

减少激进的懒散通配符
EN

Stack Overflow用户
提问于 2015-04-16 05:27:47
回答 2查看 23关注 0票数 0

我有几种模式,它们解析一个简单的文本文件以获取信息,并使用数据构建一个employee对象。有两种类型的雇员:全职和每小时。我依赖于延迟通配符来解析XML数据。我的主要问题是,懒散的通配符比预期的更具侵略性。全职薪资记录模式(patternPRF)延迟通配符从每小时的payRecord ( 2)开始,然后取下所有东西,直到它到达下一个payRecord。不管怎么说,我可以控制通配符,并说‘你走得太远了’或什么东西,以保持它仅限于所有的全职属性(monthlyIncome和月指标,而不是支付费用和支付率)?

待解析的文本文件:

代码语言:javascript
复制
<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>

Regex模式:

代码语言:javascript
复制
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
);

顺便提一句,不幸的是,我不能使用任何XML解析类作为类需求的一部分。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-04-16 06:00:42

我喜欢负判读。例如,[^"]*将匹配尽可能多的字符,这不是引号。

考虑使用这样的方法:

代码语言:javascript
复制
patternPRH = Pattern.compile(
    "<payRecordid=\"([^\"]*)\">" //1 id
    + "<EmployeeID>([^<]*)</EmployeeID>" //2 EmpID
    + "<PayHours>([^<]*)</PayHours>" //3 payHours
    + "<PayRate>([^<]*)</PayRate>" //4 payRate
);
票数 0
EN

Stack Overflow用户

发布于 2015-04-16 06:03:01

为了避免这种情况,您可以将您的对手限制在

代码语言:javascript
复制
(\d+)

而不是

代码语言:javascript
复制
(.*?)

对于payRecordId,EmployeeID。

这样做,匹配组将只获取数字,并使您的regex工作与您的

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29666015

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档