Java 减少攻击性惰性通配符

Java 减少攻击性惰性通配符,java,regex,xml,wildcard,Java,Regex,Xml,Wildcard,我有两种模式,它们解析一个简单的文本文件以获取信息,并用数据构建一个employee对象。有两种类型的员工:全职和小时工。我依靠惰性通配符来解析XML数据。我的主要问题是懒惰的通配符比预期的更具攻击性。全职薪酬记录模式模式PRF Lazy通配符从小时薪酬记录中的2开始,然后接受所有内容,直到它进入下一个薪酬记录。不管怎样,我是否可以把通配符改为说“你做得太过分了”或其他什么,以使其仅限于拥有所有全职属性的员工每月收入和月工资,而不是发薪时间和工资率 要分析的文本文件: <payRecord

我有两种模式,它们解析一个简单的文本文件以获取信息,并用数据构建一个employee对象。有两种类型的员工:全职和小时工。我依靠惰性通配符来解析XML数据。我的主要问题是懒惰的通配符比预期的更具攻击性。全职薪酬记录模式模式PRF Lazy通配符从小时薪酬记录中的2开始,然后接受所有内容,直到它进入下一个薪酬记录。不管怎样,我是否可以把通配符改为说“你做得太过分了”或其他什么,以使其仅限于拥有所有全职属性的员工每月收入和月工资,而不是发薪时间和工资率

要分析的文本文件:

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

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

我喜欢负正则表达式。例如[^]*将匹配尽可能多的非引号字符

考虑使用类似于:

patternPRH = Pattern.compile(
    "<payRecordid=\"([^\"]*)\">" //1 id
    + "<EmployeeID>([^<]*)</EmployeeID>" //2 EmpID
    + "<PayHours>([^<]*)</PayHours>" //3 payHours
    + "<PayRate>([^<]*)</PayRate>" //4 payRate
);

为了避免这种情况,您可以将您的匹配限制为

(\d+)
而不是

(.*?)
对于payRecordId,为EmployeeID


这样一来,比赛小组就不会接受数字以外的任何东西,并且让你的正则表达式像你一样工作,除非这与我的想法最接近。谢谢你的帮助!