簡體   English   中英

與5個(完全)逗號分隔的貨幣值匹配的正則表達式

[英]Regular expression that matches 5 (exactly) comma separated currency values

我需要匹配5個以逗號分隔的貨幣值。

我確實有此功能的正則表達式,但我認為這不是實現此目的的好方法。

^(\$[0-9]{1,3}(?:[,.]?[0-9]{3})*(?:\.[0-9]{2})?,\s?){4}(\$[0-9]{1,3}(?:[,.]?[0-9]{3})*(?:\.[0-9]{2})?)$

PS,我必須將表達式拆分為匹配項,用4個逗號分隔出現的內容,用1個嗅出結尾的逗號(我認為這樣做不是這樣)

一些有效的匹配輸入可能是,

$200,000,$525,$60000,$120,000,$65,456 (space between currency values is optional)
$200,000, $525, $60000,$120,000, $65,456

一些無效的輸入值,

$200,000,$525,$60000,$120,000,$65,456, (Trailing comma)
$200,000,,$525,$60000.$120,000,$65,456,, etc

任何指針將不勝感激。

編輯:我正在尋找的解決方案是一個純正則表達式解決方案(比我上面寫的要好),這樣,一旦用戶輸入了錯誤的輸入,我就可以觸發驗證。

更新

如果要在驗證價格時進行匹配,可以執行以下操作:

  • 包括點和逗號以格式化價格

  • 價格之間最多一個空格

^\$\d+([,.]\d{3})*( ?, ?\$\d+([,.]\d{3})*){4}$

現場演示

細目

  • ^匹配輸入字符串的開頭(如果設置了m標志,則匹配行)
  • \\$\\d+匹配一個在數字前面的$
  • (開始分組( #1
    • [,.]\\d{3}匹配前3位數字的句點或逗號
  • )*分組結束( #1 ),至少匹配零個時間
  • (開始分組( #2
    • ?, ? 匹配一個由可選空格(每邊一個空格)包圍的逗號
    • \\$\\d+匹配一個在數字前面的$
    • ([,.]\\d{3})*匹配一個以3位數字(千位分隔符)開頭的句點或逗號,至少匹配零個時間
  • ){4}分組結束( #2 ),精確重復4次
  • $輸入字符串的結尾(如果設置了m標志,則為行)

JS代碼:

 var re = /^\\$\\d+([,.]\\d{3})*( ?, ?\\$\\d+([,.]\\d{3})*){4}$/g; var prices = ['$200,000,$525,$60000,$120,000,$65,456', '$200,000, $525, $60000,$120,000, $65,456', '$200,000,$525,$60000,$120,000,$65,456, ', '$200,000,,$525,$60000.$120,000,$65,456,,']; prices.forEach(function(s) { console.log(s + " => " + Boolean(s.match(re))) }) 

此正則表達式是您要實現的目標的簡單版本:

^(?:\$\d{1,3}(?:,?\d{3})*[,.] ?){4}\$\d{1,3}(?:,?\d{3})*$
 -------------------------------
  • 帶下划線的部分與您定義的4個“價格”匹配,后跟一個點/逗號和一個可選空格。
  • 其余匹配最后一個“價格”。

如果有不清楚的地方請告訴我

模式的最普遍字符是\\$ (轉義),無論是字符串的第一個字符還是逗號(可選,后跟空格),這都是使用(?:^|,)\\s* 之后,您需要任意數量的數字,即\\d+ ,可以選擇后面跟一個逗號,然后再緊跟一個數字。 ,\\d+

結合這些,您將得到; /(?:^|,)\\s*(\\$\\d+(?:,\\d+)?)/g

 const pattern = /(?:^|,|\\.)\\s*(\\$\\d+(?:,\\d+)?)/g; const test = [ '$200,000,$525,$60000,$120,000,$65,456', '$200,000, $525, $60000,$120,000, $65,456', '$200,000,$525,$60000,$120,000,$65,456,', '$200,000,,$525,$60000.$120,000,$65,456,,', ]; const matches = test.reduce((carry, string) => { let match = null; while (match = pattern.exec(string)) { carry.push(match[1]); } return carry; }, []); console.log(matches); 

添加了修改后問題中的其他示例,包括. 現在顯示為分隔符( $200,000,,$525,$60000.$120,000,$65,456,, )並修改了示例中的模式以解決此問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM