2016-06-15 14 views
1

我試圖從字符串中拉出一系列以特殊字符開頭的單詞。我的代碼是:JS正則表達式與特殊字符之前的空格匹配

var specialChars = "!#^@>-/*"; 
var firstSpecialCharIndex = inputString.search(/[\\!\\#\\^\\@\\>\\\-\\/\\*]/); 
var plainText = inputString.substring(0, firstSpecialCharIndex); 
var result = {}; 
result["text"] = plainText; 

for (i = firstSpecialCharIndex + 1; i < inputString.length;) { 
    var modifiedString = inputString.substring(i); 

    var currentChar = inputString.charAt(i - 1); 
    if (result[currentChar] == null) 
     result[currentChar] = []; 
    var text = ""; 
    var specialCharIndex = modifiedString.search(/[\\!\\#\\^\\@\\>\\\-\\/\\*]/); 
    if (specialCharIndex != -1) { 
     text = modifiedString.substring(0, specialCharIndex); 
     text = text.trim(); 
     result[currentChar].push(text); 
     i += specialCharIndex + 1; 
    } else { 
     text = modifiedString.substring(0); 
     text = text.trim(); 
     result[currentChar].push(text); 
     i = inputString.length; 
    } 
} 

現在這類作品,並正確地轉動字符串:

String start ^a #b #c @d >e *f /g 

到:

{"text":"String start ","^":["a"],"#":["b","c"],"@":["d"],">":["e"],"*":["f"],"/":["g"]} 

的問題是與原字符串中使用的字符。目前,Regex認爲[email protected]不應該與@string匹配。 我只想在特殊字符前有空格時匹配。

在使用正則表達式之前可能需要一個空格嗎?有沒有其他方法可以清理正則表達式,還是它的目的是正確的?或者我需要寫更多的JS來檢查值然後清理它們或什麼?

非常感謝

+0

首先,改變正則表達式來'[#^ @>/* - !]' –

+0

謝謝@ThomasAyoub,雖然這的確不解決這個問題。 – samiles

回答

1

任何你可以使用正則表達式:

/ ([!#^@>\/*-]\w+)/gm 

有了這個代碼:

var result = {}; 
 

 

 
var re =/([!#^@>\/*-]\w+)/gm; 
 
var str = 'lorem ipsum http://google.com -h '; 
 
var m; 
 

 
var firstSpecialCharIndex = str.search(/ [!#^@>\/*-]/); 
 
result["text"] = str.substring(0, firstSpecialCharIndex); 
 

 

 
while ((m = re.exec(str)) !== null) { 
 
    if (m.index === re.lastIndex) { 
 
    re.lastIndex++; 
 
    } 
 

 
    var index = m[1].substring(0,1); 
 
    if(result[index] == null) 
 
    result[index] = []; 
 
    result[index].push(m[1].substring(1)); 
 
} 
 

 

 
console.log(result);

+0

謝謝,這幾乎可以工作,除非它不匹配,如果開始字符串是'str/ing' - 理想情況下,我希望它將整個部分識別爲字符串。當他們被包含在單詞中時,有沒有辦法「逃避」角色?謝謝 – samiles

+0

你會如何判斷這是否是一個詞? @samiles –

+0

那麼特殊字符只能*匹配前面有空格。所以'stri/ng/word'將是'(stri/ng)(/ word)','stri/ng/work'將是'(stri)(/ ng,/ work)'。希望這是明確的:) – samiles

0

您可以使用:

/\s[!#^@>\-/*]/ 

\s匹配所有空白字符[\r\n\t\f ]

,或者如果你只是想一個普通的老的空間,不包括新行或製表符

/ [!#^@>\-/*]/ 

另外你也可以dn't需要逃避所有的反斜線那些已經逃逸的事情,也不需要逃避,除了-

+0

這會阻止它匹配沒有空格,但不幸的是它停止了代碼的其餘部分工作 - 它沒有得到任何特殊字符的結果,只是返回一個空數組。謝謝,我會繼續在雷鬼音樂中玩這個空間。 – samiles

相關問題