[英]Regular expression to match brackets
對於模板引擎,我使用正則表達式來識別字符串中括號內的內容。 例如,正則表達式需要匹配 {key} 或 <tag> 或 [element]。
目前我的正則表達式是這樣的:
var rx=/([\[\{<])([\s\S]+?)([\]\}>])]/;
問題是這樣的正則表達式不會強制匹配括號。 例如在以下字符串中:
[{lastName},{firstName}]
正則表達式將匹配[{lastName}
有沒有辦法定義匹配的括號? 例如,如果左括號是 [ 那么右括號必須是 ],而不是 } 或 >
最好的方法是拆分成 3 個正則表達式,尤其是當不同的括號可以有不同的含義時:
var rx1 = /\[([^\]]+)]/;
var rx2 = /\(([^)]+)\)/;
var rx3 = /{([^}]+)}/;
這些將分別匹配[]
、 ()
和{}
包圍的任何文本,以及第一個匹配組中的文本。
您可以使用管道字符 ( |
) 的替代品,例如/\[([\s\S]+?)\]|\{([\s\S]+?)\}|<([\s\S]+?)>/
,雖然它變得很長。
編輯:縮短了正則表達式,不再那么長了......
var rx = /\[[^\]]+\]|\{[^}]+\}|<[^>]+>/;
有沒有辦法定義匹配的括號? 例如,如果左括號是 [ 那么右括號必須是 ],而不是 } 或 >
有點。
ERE 沒有提供一種方法讓您按照您描述的方式將右括號與左括號匹配。 (也許可以使用 PREG 魔法,但我必須把它留給其他人。)您需要有多個正則表達式,或者在一個正則表達式中有多個原子。
如果您使用單個正則表達式,我想您需要確定要檢測的括號字符串的類型以及該字符串的內容。 正如評論中提到的,您需要使用您的編程語言來執行此操作,但您至少可以從正則表達式中獲得所需的內容。
在下面的正則表達式中,每種樣式的字符串在 RE 中表示為一個“分支”。 分支由或線 ( |
) 分隔。 為清楚起見,我假設所有字符串都是[:alnum:]
。 您尚未指定內容,因此需要根據您的特定要求進行調整。
/(\[)([[:alnum:]]+)\]|(\()([[:alnum:]]+)\)|(\{)([[:alnum:]]+)\}/
↑ ↑ ↑ ↑
$1 $2 divider divider
請注意,在每個分支中,第一個字符都用圓括號括起來,使其成為一個“原子”。 你需要你的代碼像反向引用一樣引用這個原子。 第二個原子是內弦。 現在……我的 JavaScript 不如我的烘焙技巧強,但這可能是一個開始:
String.prototype.bracketstyle = function() {
var re = /(\[)([:alnum:]+)\]|(\()([:alnum:]+)\)|(\{)([:alnum:]+)\}/;
return this.replace(re,"$1");
}
String.prototype.innerstring = function() {
var re = /(\[)([:alnum:]+)\]|(\()([:alnum:]+)\)|(\{)([:alnum:]+)\}/;
return this.replace(re,"$2");
}
我懷疑您可以將它們組合成一個函數,或者以不同的方式使用它們而不將它們變成一個函數,但您明白了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.