簡體   English   中英

正則表達式零量詞在.NET和Mono上的行為有所不同

[英]Regular Expression Zero quantifier behaves differently on .NET and Mono

我正在嘗試在C#中使用正則表達式將字符串分解為多達3個不同的部分,即Left,Middle和Right。 表達式模式是使用輸入參數設置左和右量詞動態構建的。 在大多數情況下,如果量詞為1或更高,則可以正常工作,但是,如果將左右量詞設置為零,則Windows上的.NET 3.5和Suse的Mono 2.01.9上的行為是不同的。

例如,使用以下匹配字符串測試字符串“ 1412”:

^(?<left>.{0})(?<mid>.+)(?<right>.{0})

在Windows(.NET 3.5)上,匹配組按預期顯示:

left:
mid:   1412
right:

在Suse(Mono 2.10.9)上,匹配組為:

left:   141
mid:    2
right:

因此,如果我將模式中的左和右量詞更改為非貪婪,那么在兩個平台上我都會得到相同的(預期的)結果:

^(?<left>.{0}?)(?<mid>.+)(?<right>.{0}?)

left:
mid:    1412
right:

盡管這似乎可以解決問題,但是此部分代碼對於我們的應用程序至關重要,因此我想了解為什么行為在原始模式中會有所不同。

正則表達式中有一些懶惰和貪婪的量詞,根據掌握正則表達式 (從此處獲取 ),

在決策由“嘗試”和“跳過嘗試”之間決定的情況下(例如由量詞控制的項目),引擎始終會選擇首先嘗試進行貪婪的量詞,然后首先跳過嘗試進行懶惰(非貪婪)。

由於某些原因, Mono regex遵循此路徑,.NET Framework通過應用適當的行為來使用正則表達式設置的邏輯。

暫無
暫無

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

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