簡體   English   中英

正則表達式 - 無限錯誤意味着什么?

[英]Regex - what does the infinite error mean?

我現在坐在一些技術面試中,我們問一個關於檢查花括號是否平衡的問題(相同的打開/關閉數量,並且關閉從不進行匹配打開)在一個字符串中 - 要求人們寫一個小的功能來驗證這一點。

一些候選人考慮過嘗試使用正則表達式來解決這個問題,然后很快就放棄了。 我決定嘗試一下,看看是否有可能。 我目前正在使用以下測試字符串:

通過

{(function(r){ return r; })()} {}{}{}{} {{{{}}}}

失敗

}{ {{}}} {{{}}

我認為以下正則表達式會起作用[^{}]*({[^{}]*})*[^{}]* 我的想法是匹配非大括號字符,然后匹配{然后非大括號字符,然后} ,重復括號內的匹配,然后用任何非大括號字符結束。

我使用regexr.com時似乎遇到了infinite錯誤,我不明白為什么:

在此輸入圖像描述

任何人都可以解釋究竟是什么造成的嗎?

您將收到無限錯誤,因為您的正則表達式可以匹配任何文本。 由於所有組都標有* ,因此它們都被視為可選( *匹配零次或多次出現)。 這意味着引擎可以在模式中找到零個出現的任何組,並仍然認為文本匹配。

考慮用+標記至少一個組,這意味着“一個或多個”而不是“零或更多”。 試試這種模式:

[^{}]*(\{[^{}]*\})+[^{}]*

這樣,引擎有一些限制,它必須匹配您的模式才能被接受。

注意:當不在字符塊( [] )中時,轉義{}也是明智的。 我在上面的模式中做到了這一點。 Regexr.com似乎並不關心,但有些引擎可能會在沒有它們的情況下產生解析錯誤。

更新

這是你需要的正則表達式(一級):

\{{0,1}[^\{\}]*\{[^\{\}]*\}[^\{\}]*\}{0,1}

我不能寫嵌套規則,但你可以說你需要多少級別。

說明:

| - 表示替代(a | b - 字面匹配“a”或“b”)
^ - 表示行的開頭(^ a - 匹配任何以“a”字面開頭的字符串,“出租車”,“蘋果”......)
$ - 表示行尾($ - 匹配以字母“a”結尾的任何字符串,“傘”)
\\ { - 匹配字符:“{”字面意思
\\( - 匹配字符:“(”字面意思

暫無
暫無

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

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