2017-02-10 171 views
0

這看起來有點毛茸茸,所以我希望有人可以給它一次。帶分號和空格的JavaScript正則表達式

意圖是將字符串拆分爲一個子字符串數組,前後要拆分的字符作爲子字符串組件的一部分被保留(即沒有丟失,因爲它將在典型的拆分中丟失)。分割應該在'endsWith'中定義的字符之後,並且在'startsWith'中定義的字符之前。

最初我用'endsWith'功能編寫了它,它運行良好(如後文所述),但是當我添加'startsWith'功能時,事情開始變得有點拗口。

var input = "foo bar;baz#qux>quux,rawr"; 

var startsWith = ['#', ',']; 
var endsWith = [';', '\\s', '>']; 

var re = new RegExp("(?=[" + startsWith.join('') + "])(.*?[" + endsWith.join('') + "]+)", "g"); 
console.log(re); //=> /(?=[#,])(.*?[;\s>]+)/g 

var result = input.split(re).filter(Boolean); 
console.log(result); 

結果:[ '富巴;巴茲', '#qux>', 'QUUX,RAWR']

預期:[ '富', '巴;', '巴茲',' #qux>','quux',',rawr']

問題是它沒有在空白符或分號後分裂,好奇地是它在大於符號後分裂。

(添加第二個字符來startsWith很顯然,它不是分裂的共同之後 - 在正則表達式的「#」,也不管秩序「」)

另一個有趣的事情是,除該 'startsWith' 的東西,只是使其:

var re = new RegExp("(.*?[" + endsWith.join('') + "]+)", "g"); 
    console.log(re); //=> /(.*?[;\s>]+)/g 

的分號和空格現在的工作:[ '富', '巴;', '巴茲#qux>', 'QUUX,RAWR']

但我也想startsWith功能('#qux'和',rawr'分開),我不知道第二,爲什麼我看到這個問題時,多數民衆贊成重新添加在

+0

你能試着用簡單的英語來解釋你的需要嗎?根據我的理解,你想要提取以任何'startsWith'數組開頭並以任何'endsWith'數組結尾的字符串,對吧? – sp00m

+0

如果「startsWith」沒有產生預期結果,有什麼好處?你要求正則表達式從'#'開始匹配,這正是使用'(?=#)'時正則表達式引擎正在做的事情。如果不需要,請將其移除。如果需要,預計第一批結果。 –

+0

我已經添加了我的意圖sp00m英文解釋,謝謝:) – braks

回答

1

檢查它現在

var input = "abc&foo bar;baz#qux>quux,awrr"; 
 
    var re = /([#,]?[^#;>\s,]*[\;\s\>]?){1}/g 
 
    console.log(re); 
 

 
    var result = input.split(re).filter(Boolean); 
 
    console.log(result);

+0

如果我將任何符號放入文本中,例如,它將在&上拆分,而這不是有效的拆分字符之一。 – braks

+1

現在檢查它@braks –

+0

越來越近我修改了一下,這到目前爲止:var re = /([#,]?[^#,;> \ s] * [; \ s \>]?){ 1}/g – braks

0

定義您re對象:

var re = new RegExp("([" + startsWith.join('') + "]+.*?[" + endsWith.join('') + 
     "]+)|[" + endsWith.join('') + "]+"); 
//=> /(#.*?[;\s>])|[;\s>]+/ 
  1. 它採用#之間的捕獲組到結束的人物之一,這樣split回報相同在結果中捕獲文本
  2. 它使用替換來允許拆分由endsWith數組定義的某個給定字符。

然後用它作爲:

var result = input.split(re).filter(Boolean); 
//=> ["foo", "bar", "baz", "#qux>", "quux"] 
+0

看起來很有前途,但只要我測試一個輸入變化就會失敗。 var input =「foo bar; baz#qux> quux,rawr」; var startsWith = ['#',',']; – braks

+0

現在回答我的更新正則表達式。對於給定的輸入,它產生:'['foo','bar','baz','#qux>,'quux,rawr']' – anubhava

0

我THIK這應該工作:

const splitChars = [' ', ';', '#', '>'] 
 
const regex = new RegExp(`(.*?(?:${splitChars.join('|')}))`) 
 
let str = "foo bar;baz#qux>quux" 
 

 
const array = str.split(regex).filter(x => x != "") 
 
console.log(array)

+0

這產生了一個不正確的結果:['foo','bar;' ,'baz#','qux>','quux']而不是['foo','bar;','baz','#qux>','quux'] - 注意#符號。 – braks