2017-04-20 92 views
1

我試圖評估在個人ID文本字段對兩個同步模式的字符串(圖1):是否可以在AngularJS中使用雙正則表達式(正則表達式)計算字符串?

Fig. 1

此字段供用戶輸入他的個人西班牙語(DNI)或葡萄牙語(Cartãodecidadão)的國家身份證號碼,這個想法是一次評估兩種模式,而不是關心地區設置(網站是西班牙文,英文和葡萄牙文)。

那些模式應該是:

  1. 西班牙語:/^[0-9]{8}[TRWAGMYFPDXBNJZSQVHLCKET]{1}$/i(即12345678A)
  2. 葡萄牙語:/^[0-9]{7,8}\[0-9]\([A-Z]|[0-9]){2}[0-9]$/(即04521225)

由此,形式的代碼段如下所示:

<input type="text" name="field_dni" 
    class="form-control form-control-400" id="field_dni" 
    ng-model="vm.form.dni" 
    ng-minlength=9 
    ng-maxlength=9 
    ng-pattern= "vm.verificarId" /> 
<div ng-show="verificarForm.field_dni.$invalid"> 
    <p class="help-block" 
     ng-show="verificarForm.field_dni.$error.pattern" 
     translate="verificar.validation.pattern">The pattern entered is 
     incorrect 
    </p>  
    <p class="help-block" 
     ng-show="verificarForm.field_dni.$error.required" 
     translate="verificar.validation.required">This field is required. 
    /p> 
    <p class="help-block" 
     ng-show="verificarForm.field_dni.$error.minlength" 
     translate="verificar.validation.minlength">This field is required to 
     be exactly 9 characters long 
    </p>   
    <p class="help-block" 
     ng-show="verificarForm.field_dni.$error.maxlength" 
     translate="verificar.validation.maxlength">This field is required to 
     be exactly 9 characters long 
    </p> 

正如你所看到的,wha噸應該發生的是,每一個驗證(長度和模式)進行評估。

的相關負責人片段看起來是這樣的:

function ValidateController($scope, Principal, ValidateService, $state) { 
    var vm = this; 
    vm.verificarId= /^[0-9]{8}[TRWAGMYFPDXBNJZSQVHLCKET]{1}$/i|/^[0-9]{7,8}\[0-9]\([A-Z]|[0-9]){2}[0-9]$/; 

這是行不通的。該模式似乎被忽略。我曾嘗試在兩個正則表達式之間放置括號,例如:

/(^[0-9]{8}[TRWAGMYFPDXBNJZSQVHLCKET]{1}$/i)|(/^[0-9]{7,8}\[0-9]\([A-Z]|[0-9]){2}[0-9]$)/ 

但是會引發語法錯誤。 我設法讓這個部分工作的唯一方法是將一個regExp或另一個regExp硬編碼到ng模式組件中。但這不是最佳的,因爲兩者都需要共同努力。

是否有這樣做的更好,「Angularier」的方式?我試圖在regex101中重新構建正則表達式,但沒有成功。

+1

嘗試'/^([0-9] {8} [trwagmyfpdxbnjzsqvhlcketTRWAGMYFPDXBNJZSQVHLCKET] | [0-9] {7,8} \ [0-9] \([AZ] | [0-9]){2} [0-9 ])$ /;' –

+0

嗨Wiktor的,感謝您的評論, 只是想你的正則表達式,並得到了這一點: '無效的正則表達式:/ ^([0-9] {8} [trwagmyfpdxbnjzsqvhlcketTRWAGMYFPDXBNJZSQVHLCKET ] | [0-9] {7,8} \ [0-9] \([AZ] | [0-9]){2} [0-9])$ /:Unmatched') '' 狩獵這個流氓括號,我設法得到第一個條件工作(12345678A),但不是第二個。似乎是一個語法問題。 – wickedchild

+0

我剛剛複製你的。所以,在你身邊找一個問題。也許你的第二個是['^ [0-9] {7,8} [0-9] [A-Z0-9] {2} [0-9] $'](https://regex101.com/ R/FrA28c/1)?那麼你的正則表達式應該像['^([0-9] {8} [trwagmyfpdxbnjzsqvhlcketTRWAGMYFPDXBNJZSQVHLCKET] | [0-9] {7,8} [0-9] [A-Z0-9] {2} [0- 9])$'](https://regex101.com/r/ONPHJl/1)。不要從註釋中複製粘貼,因此爲了更好的外觀,將垃圾字符插入這些文本中。 –

回答

0

我覺得現在的問題是,你在視圖中使用的虛擬機。假設你正在使用的控制器在視圖,控制器範圍視圖的範圍,除非你正在使用別名

所以,你應該使用ng-pattern= "verificarId" instate的ng-pattern= "vm.verificarId"

+0

嗨貢薩洛, 我試過你的方法,但它也不工作。我測試打印JSON作爲我填的表格,並與vm.verificarId我得到這個(注意「形式」): '{ 「doNotMatch」:空, 「錯誤」:空, 「errorUserExists」 :空, 「registerAccount」:{}, 「成功」:空, 「dniValidate」:空, 「$決心」:{ 「$ stateParams」:{}, }, 「形式」: { 「dni」:「123456789」 } }' 當我刪除「vm」時,表單甚至沒有出現在JSON日誌中。 – wickedchild

相關問題