簡體   English   中英

匹配括號的正則表達式

[英]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.

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