正则表达式解析带转义字符的字符串

McF*_*ane 6 javascript regex

我正在从格式化的字符串中读取信息。格式如下:

"foo:bar:beer:123::lol"
Run Code Online (Sandbox Code Playgroud)

“:”之间的所有内容都是我想使用正则表达式提取的数据。如果一个:后跟另一个:(例如“ ::”),则此数据必须为“”(空字符串)。

目前,我正在使用此正则表达式进行解析:

(.*?)(:|$)
Run Code Online (Sandbox Code Playgroud)

现在我想到数据中也可能存在“:”。所以它必须被逃脱。例:

"foo:bar:beer:\::1337"
Run Code Online (Sandbox Code Playgroud)

如何更改正则表达式,使其也与数据中的“ \:”匹配?

编辑:我使用JavaScript作为编程语言。对于复杂的regulat表达式,似乎有一些限制。该解决方案也应在JavaScript中运行。

谢谢,麦克法兰

Tim*_*ker 4

var myregexp = /((?:\\.|[^\\:])*)(?::|$)/g;
var match = myregexp.exec(subject);
while (match != null) {
    for (var i = 0; i < match.length; i++) {
        // Add match[1] to the list of matches
    }
    match = myregexp.exec(subject);
}
Run Code Online (Sandbox Code Playgroud)

输入:"foo:bar:beer:\\:::1337"

输出:["foo", "bar", "beer", "\\:", "", "1337", ""]

你总是会得到一个空字符串作为最后一个匹配项。考虑到您还希望在分隔符之间匹配空字符串(并且 JavaScript 中缺乏后向断言),这是不可避免的。

解释:

(          # Match and capture:
 (?:       # Either match...
  \\.      # an escaped character
 |         # or
  [^\\:]   # any character except backslash or colon
 )*        # zero or more times
)          # End of capturing group
(?::|$)    # Match (but don't capture) a colon or end-of-string
Run Code Online (Sandbox Code Playgroud)