簡體   English   中英

無法解析 - 在Javascript中的正則表達式

[英]unable to parse - in Regular expression in Javascript

我對Javascript中的正則表達式有點新意。

我正在嘗試編寫一個名為parseRegExpression()的函數,它解析傳遞的屬性並生成一個鍵/值parseRegExpression()對輸入工作正常:

"iconType:plus;iconPosition:bottom;"

但它無法解析輸入:

"type:'date';locale:'en-US';"

基本上-符號被忽略了。 代碼位於:

http://jsfiddle.net/visibleinvisibly/ZSS5G/

正則表達式鍵值對如下

/[a-z|A-Z|-]*\s*:\s*[a-z|A-Z|'|"|:|-|_|\/|\.|0-9]*\s*;|[a-z|A-Z|-]*\s*:\s*[a-z|A-Z|'|"|:|-|_|\/|\.|0-9]*\s*$/gi;    

替換代碼中的正則表達式如下:

regExpKeyValuePair = /[-a-z]*\s*:\s*[-a-z'":_\/.0-9]*\s*;|[-a-z]*\s*:\s*[-a-z'":-_\/.0-9]*\s*$/gi;              
regExpKey = /[-a-z]*/gi;
regExpValue = /[-a-z:_\/.0-9]*/gi;
  • 你不需要逃避。 在里面[]
  • 無需放| 元素之間[]
  • 因為您正在使用/i標志,所以不需要[AZ]。
  • -應該在開頭或結尾。

有一些問題:

  • A | 在一個字符類中意味着一個文字| 性格,而不是交替。
  • . 在一個字符類中意味着一個文字. 性格,所以沒有必要逃避它。
  • A -作為字符類中的第一個或最后一個字符表示文字-字符,否則表示字符范圍。
  • 使用不區分大小寫的修飾符( i )時,不需要使用[a-zA-Z] ; [az]就夠了。
  • 你改變的唯一區別是最后一點; 只需將您的交替限制在不同的部分,就可以大大簡化這一過程。

這應該等同於您的原始模式:

/[a-z-]*\s*:\s*[a-z0-9'":_\/.-]*\s*(?:;|$)/gi

你可以避免正則表達式:

var test1 = "iconType:plus;iconPosition:bottom;";
var test2 = "type:'date';locale:'en-US';";

function toto(str) {
    var result = new Array();
    var temp = str.split(';');
    for (i=0; i<temp.length-1; i++) {
        result[i] = temp[i].split(':',1);
    }
    return result;
}

console.log(toto(test1));
console.log(toto(test2));

在字符集atom [...]內部管道char | 只是一個常規字符,並不代表“或”。

字符集atom列出要接受的字符或范圍(如果字符集以^開頭,則排除),並且“or”是隱式的。

您可以在字符集中使用反斜杠(如果需要包括/排除近括號]^符號,短划線-用於范圍,反斜杠\\本身,不可打印的字符或者如果要使用非-ASCII unicode char指定代碼而不是字面意思。

然而,正則表達式語法還允許您通過將字符放置在不具有特殊含義的位置來避免字符集原子中的反斜杠轉義...例如破折號-作為集合中的第一個或最后一個(它不能意味着一個范圍)。

另請注意,如果您需要能夠匹配作為引用字符串的值,包括反斜杠轉義,則正則表達式更復雜,例如

'(?:[^'\\]|\\.)*'|"(?:[^"\\]|\\.)*"

匹配包含反斜杠轉義的單引號或雙引號字符串,含義為:

  • 單引號'
  • 零或更多:
    • 任何字符除了單引號'或反斜杠\\
    • 一對由反斜杠\\后跟任何字符組成
  • 單引號'

或者用雙引號"相反。

請注意,組已使用(?:...)而不是plain (...)分隔以避免捕獲

它與連字符不匹配,因為它解釋|-| 作為從|開始的范圍 並以|結束 (我原本希望將其視為語法錯誤,但是你有它。它在我嘗試過的每種正則表達式中都有相同的效果。)

看看這個正則表達式:

/(?:^|;)([a-z-]*)\s*:\s*([a-z'":_\/.0-9-]*)\s*(?=;|$)/ig

正如其他響應者所建議的那樣,我把它折疊成一個替代方案,刪除了不需要的管道,並通過將連字符移動到最后來逃脫連字符。 我也在開始和結束時都把它固定下來。 無論如何,或者盡我所能地錨定它。 我使用前瞻來匹配尾隨的分號,所以當下一場比賽開始時它仍然存在。 它遠非萬無一失,但只要輸入結構良好,它就可以正常工作。

暫無
暫無

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

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