我想獲得整個數值97.47,但是正則運算式將其分割為9和7.47,并將其添加到不同的欄位。 這是使用的正則運算式
private static final Pattern COMMISSION_PATTERN =
Pattern.compile(
"(total[(?:(?<totalFixed>d )(s*( )s*)?"
"((?<totalPercent>d (.d{1,2})?)s*%)?"
"(s*mins*(?<totalMin>d ))?"
"(s*maxs*(?<totalMax>d ))?"
"(s*rounds*(?<totalRound>d ))?)?(s*)"
"(partner[(?:(s*negative:s*(?<partnerNegative>(true|false))?s*,s*)?"
"((?<partnerFixed>d )(s*( )s*)?)"
"((?<partnerPercent>d (.d{1,2})?)s*%)?"
"(s*mins*(?<partnerMin>d )?"
"(s*maxs*(?<partnerMax>d ))?"
"(s*rounds*(?<partnerRound>d ))?"
"(s*modes*(?<partnerMode>w ))?)?") 。)
下面的值到達了方法中 "total[0] partner[97.47%]" 它是這樣被決議的:
String sCommission = "total[0] partner[97.47%]"/span>。
for (String comm : sCommission.split("
")) {
Matcher matcher = COMMISSION_PATTERN.matcher(comm.trim())。
if (matcher.matches()) {
String sPartnerFixed = matcher.group("partnerFixed"); /9
String sPartnerPercent = matcher.group("partnerPercent"/span>); /7.47
而它應該是:
String sPartnerFixed = matcher. group("partnerFixed"); //null。
String sPartnerPercent = matcher.group("partnerPercent"); /97.47
我無法找出正則運算式中的錯誤所在
uj5u.com熱心網友回復:((?<partnerFixed>d )(s*( )s*)?)? 部分是可選的,partnerFixed組中的d 成為(? <partnerPercent>d (?:.d{1,2})?)部分(其中d 也是必需的,并且匹配一個或多個數字)的regex。所以,你的這種行為是意料之中的,除非你告訴重碼引擎在這兩個數字匹配部分之間明確有一個強制性的模式。
一個可能的解決方案是在(?<partnerFixed>d )部分的d 之后加上一個字界,即 用"((?<partnerFixed>d )(s*( )s*)?)?"替換"((?<partnerFixed>d )(s*( )s*)?"。
解決這個問題的一個更復雜和更精確的方法是使(s*( )s*)?模式的某些部分成為強制性的。也就是說,如果有一連串的數字,后面可以選擇.和一個或兩個數字,你就不要指望匹配partnerFixed。如果有一個partnerFixed數字,它應該與下一個值分開?我認為應該有一個空白或 ,用可選的空白括起來,只是從模式上推斷。
在后一種情況下,你可以用"((?<partnerFixed>d )(s*( )s*)?)?"替換"((?<partnerFixed>d )(s |s* /s*)?"。
參見這個詞組演示。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/307551.html
標籤:
