![](/img/trans.png)
[英]Javascript : Split string with RegEx and remove pattern from the array
[英]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+))?
唯一真正的訣竅是只將逗號后面的下一位作為后一個處理,如果它看起來不像下一個的類型。
每場比賽都會捕獲這些組:
如果你只想按照你所說的那樣進行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.