簡體   English   中英

簡單正則表達式的難度(匹配前綴/后綴)

[英]Difficulty with Simple Regex (match prefix/suffix)

我正在嘗試開發一個將在C#程序中使用的正則表達式。

我最初的正則表達式是:

(?<=\()\w+(?=\))

哪個成功地匹配“(foo)” - 匹配但是從輸出中排除開放和關閉的parens,以產生簡單的“foo”。

但是,如果我將正則表達式修改為:

\[(?<=\()\w+(?=\))\]

我嘗試匹配“[(foo)]”它無法匹配。 這是令人驚訝的。 我只是在我的前一個表達式前面添加和附加文字的開括號和閉括號。 我很難過。 我使用Expresso來開發和測試我的表達式。

在此先感謝您的幫助。

羅伯塞西爾

你的后視是問題所在。 以下是字符串的處理方式:

  1. 我們看到[在字符串中,它與正則表達式匹配。
  2. 正則表達式中的后瞻性要求我們查看前一個字符是否為'('。這失敗了,因為它是'''。

至少那就是我猜的是導致問題的原因。

試試這個正則表達式:

(?<=\[\()\w+(?=\)\])

脫離背景,很難判斷,但這里的后衛可能有點過分。 它們對於排除字符串很有用(例如在strager的例子中)以及在簡單RE失敗的其他特殊情況下,但我經常看到它們用於更簡單的表達式更容易編寫,更多RE風格並且可能更快的情況。
在你的情況下,你可以編寫(\\b\\w+\\b)例如,甚至(\\w+)使用自然邊界,或者如果你想區分(foo)和-foo-(例如),使用\\((\\w+)\\)
現在,也許上下文決定了這種錯綜復雜的用法(或者你可能只是嘗試了后視),但知道替代方案是很好的。

現在,如果你只是好奇為什么第二個表達式不起作用:這些被稱為“零寬度斷言”:它們檢查后面或前面的內容是否符合預期,但它們不消耗字符串所以在它們之后(或之前,如果是否定的)它們必須匹配斷言。 例如。 如果你在積極前瞻之后放了一些與斷言不匹配的東西,你肯定RE會失敗。

暫無
暫無

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

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