2016-11-03 35 views
1

排除模式應該有一個逗號分隔的文本,其中每一個章節都有與否的字符串 - 像如何匹配令牌與表達文本/無JavaScript中的正則表達式

一個令牌列表 - 逗號分隔
var tokens=['Inc.','Ltd','LLC']; 

因此字符串是像

var companies="Apple, Inc., Microsoft, Inc., Buzzfeed, Treasure, LLC"; 

欲獲得該陣列作爲輸出

var companiesList = [ 
    "Apple Inc.", 
    "Microsoft Inc.", 
    "Buzzfeed", 
    "Treasure LLC" 
    ]; 

所以,我首先做了一個RegExp

var regex=new RegExp("([a-zA-Z&/? ]*),\\s+("+token+")", "gi") 

我得到的比賽和搜索正則表達式像

var regex=new RegExp("([a-zA-Z&/? ]*),\\s+("+item+")", "i") 

每個令牌:

tokens.forEach((item) => { 
    var regex = new RegExp("([a-zA-Z&/? ]*),\\s+(" + item + ")", "gi") 
    var matches = companies.match(regex) || [] 
    console.log(item, regex.toString(), matches) 
    matches.forEach((m) => { 
     var regex = new RegExp("([a-zA-Z&/? ]*),\\s+(" + item + ")", "i") 
     var match = m.match(regex) 
     if (match && match.length > 2) { 
      var n = match[1].trim(); 
      var c = match[2].trim(); 
      companiesList.push(n + ' ' + c); 
     } 
    }); 
}); 

這樣我可以捕獲令牌和concat匹配組1和2.

var tokens = ['inc.', 'ltd', 'llc'], 
 
    companies = "Apple, Inc., Microsoft, Inc., Buzzfeed, Treasure, LLC", 
 
    companiesList = []; 
 
tokens.forEach((item) => { 
 
    var regex = new RegExp("([a-zA-Z&/? ]*),\\s+(" + item + ")", "gi") 
 
    var matches = companies.match(regex) || [] 
 
    console.log(item, regex.toString(), matches) 
 
    matches.forEach((m) => { 
 
    var regex = new RegExp("([a-zA-Z&/? ]*),\\s+(" + item + ")", "i") 
 
    var match = m.match(regex) 
 
    if (match && match.length > 2) { 
 
     var n = match[1].trim(); 
 
     var c = match[2].trim(); 
 
     companiesList.push(n + ' ' + c); 
 
    } 
 
    }); 
 
}); 
 

 
console.log(companiesList)

的問題是,我的思念像逗號分隔後沒有文字令牌逗號:Buzzfeed

的想法是負的外觀使用非捕獲組提前(見here關於正則表達式匹配非捕獲組)

/([a-zA-Z]*)^(?:(?!ltd).)+$/gi 

但這種方式我在輸入字符串的時候有任何比賽標記存在:

"Apple, Inc., Microsoft, Inc., Buzzfeed, Treasure LLC".match(/([a-zA-Z]*)^(?:(?!llc).)+$/gi) 

,而我只想沒有它,所以我想獲得匹配文本 - 就像之前相反:

["Buzzfeed"] 

那麼如何否定/修改前面的代碼在這兩種情況下工作以獲得最終的組成陣列:

var companiesList = [ 
     "Apple Inc.", 
     "Microsoft Inc.", 
     "Buzzfeed", 
     "Treasure LLC" 
     ]; 
+0

你誤會答案在流行SO問題有關配套不包含單詞的字符串。您需要'(?!ltd | etc)'前瞻性的地方,您可以在管道之後添加替代品。 –

+0

@WiktorStribiżewuhm這是可能的,但檢查代碼,並嘗試一下,我有一些模式要尊重像'Name,Inc.'。所以我必須匹配這種模式和後者(沒有)。 – loretoparisi

+1

要匹配Buzzfeed,您需要排除匹配那些'LLC'等,以及所有跟隨它們的單詞。 [這](https://jsfiddle.net/wav6gaob/)不好看。也許adaneo提出了一個更好的出路。 –

回答

1

豈不是輕鬆了許多,只是減少了,而只是檢查令牌列表,當您去

var tokens = ['Inc.','Ltd','LLC']; 
 
var companies = "Apple, Inc., Microsoft, Inc., Buzzfeed, Treasure, LLC"; 
 

 
var result = companies.split(',').reduce((a,b,i) => { 
 
    return tokens.indexOf(b.trim()) === -1 ? a.push(b.trim()) : a[a.length-1] += b,a; 
 
}, []); 
 

 
console.log(result);

+0

哈哈哈太多了'RegExp'頭腦在我心中。我認爲你的解決方案應該在大多數情況下工作得很好! +1。將在我的風景中嘗試它,但它似乎非常聰明。 – loretoparisi

+1

這其實只是一個建議,但它似乎比那個正則表達式惡夢更容易,是的,它應該與任何東西一起工作,只要該值在令牌列表中,並且很容易使其不區分大小寫,修剪空白,或其他你需要的東西。 – adeneo

+0

絕對感謝,因爲有「奇怪的例子」和「inc」等等,在某個時候也許最好全部進來,而正則表達式的噩夢是真實的! – loretoparisi

1

你可以使用正則表達式的分裂。

var companies = "Apple, Inc., Microsoft, Inc., Buzzfeed, Treasure, LLC"; 
 

 
console.log(companies.split(/,\s(?!Inc\.|Ltd|LLC)/i).map(s => s.replace(', ', ' ')));

+0

這也適用,但如何應用到任意長度的標記數組? – loretoparisi

+1

在這種情況下腺苷的減少效果更好。 –