簡體   English   中英

使用RegEx模式將字符串拆分為數組

[英]Split String into Array with RegEx Pattern

我有一個字符串,我想拆分成一個數組。 字符串看起來像這樣:

'O:BED,N:KET,OT,N:JAB,FA,O:RPT,'

該字符串可以包含任意數量的對象,例如

'O:BED,N:KET,OT,N:JAB,FA,O:RPT,X:BLA,GTO'

我想在\\w:的實例上拆分這個字符串\\w:例如O:

所以我最終會得到這樣的數組:

['O:BED','N:KET, OT','N:JAB,FA','O:RPT']

我使用以下代碼:

var array = st.split(/^(\w:.+)(?=\w:)/g);

但是我最終得到這樣的數組:

['','O:BED,N:KET,OT,N:JAB,FA,','O:RPT,']

似乎正則表達式是貪婪的,我該怎么做才能解決它?

注意我正在使用angularjs,最終我想結束這個:

   var objs = [
     {type:O,code: BED, suf: ''},
     {type:N, code: KET, suf: OT},
     {type:N, code: JAB, suf: FA},
     {type:O, code: RPT, suf: ''}
     ]

如果您的字符串格式正確將更容易。 但我們仍然可以通過額外的努力來完成任務。 希望以下代碼適合您。

var str = 'O:BED,N:KET,OT,N:JAB,FA,O:RPT,X:BLA,GTO';

var a = str.split(',');
var objs = [], obj, item, suf;

for(var i=0; i<a.length;){
  item = a[i].split(':');

  if(a[i+1] && a[i+1].indexOf(':') == -1){
    suf = a[i+1];
    i++;
  }else{
    suf = "";
  }

  obj = {
    type: item[0],
    code: item[1],
    suf: suf
  };

  objs.push(obj);
  i++;
}

console.log(objs);

您可以使用RegExp.prototype.exec方法獲取連續匹配,而不是使用分隔符拆分字符串:

var myStr = 'O:BED,N:KET,OT,N:JAB,FA,O:RPT,';
var myRe = /([^,:]+):([^,:]+)(?:,([^,:]+))??(?=,[^,:]+:|,?$)/g;
var m;
var result = [];

while ((m = myRe.exec(myStr)) !== null) {
  result.push({type:m[1], code:m[2], suf:((m[3])?m[3]:'')});
}

console.log(result);

你想做一個字符串匹配 ,然后迭代它。

AngularJS中的完整示例: http//jsfiddle.net/184cyspg/1/

var myString = 'O:BED,N:KET,OT,N:JAB,FA,O:RPT,';
$scope.myArray = [];
var objs = myString.match(/([A-Z])\:([A-Z]*)\,([A-Z]?)/g);
objs.forEach(function (entry) {
    var obj = entry.replace(',', ':');
    obj = obj.split(':');
    $scope.myArray.push({type: obj[0], code: obj[1], suf: obj[2]});
});

我喜歡正則表達式:)

如果要在所有匹配項中使用全局標志和exec() ,這將匹配字符串的每個對象:

(\w):(\w+)(?:,((?!\w:)\w+))?

唯一真正的訣竅是只將逗號后面的下一位作為后一個處理,如果它看起來不像下一個的類型。

每場比賽都會捕獲這些組:

  1. 類型
  2. SUF

如果你只想按照你所說的那樣進行split ,那么你貪婪問題的解決辦法就是告訴它在逗號上拆分,然后是那些匹配的對象,例如:

,(?=(\w):(\w+)(?:,((?!\w:)\w+))?)

以下內容並未解決您的正則表達式問題,但是引入下划線來處理從簡單操作到更復雜操作的替代方法。 雖然在這種情況下有點矯枉過正;

// ie. input string = 'O:BED,N:KET,OT,N:JAB,FA,O:RPT,';
.controller('AppCtrl', [function() {
    /**
     * Split by comma then (chain) eval each (map) 
     * element that (if-else) contains '0:' is pushed 
     * into array as a new element, otherwise concat element
     * 
     * :#replace hardcoded values with params
     *
     * @param String string - a string to split
     * @param String prefix - prefix to determine start of new array element ie. '0:'
     * @param String delimiter - delimiter to split string ie ','
     * @return Array array of elements by prefix
     */
    $scope.splitter = function(string) {
      var a = [];
      var tmp = "";

      _.chain(string.split(',')) 
        .map(function(element) {
          if(element.indexOf('O:') >= 0) {
            element += tmp;
            a.push(element);
            tmp = "";
          } else {
            tmp += element;
          }
        });

      return a;
    };
}]);

輸出:

array: Array[2]
  0: "O:BED"
  1: "O:RPTN:KETOTN:JABFA"
length: 2

更新:只需閱讀您對對象的要求。 underscorejs允許鏈接操作。 例如,可以調整上面的代碼來處理對象,鏈接到.compact()。object()。value()以產生輸出為Object k:v對;

希望這可以幫助。

暫無
暫無

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

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