[英]In c# I'm looking for a regex that will only match the first occurrence
在下面的一段代碼 (C#) 中,我想替換 ContentType 注釋中 Order 和 GUID 的值:
[ContentType(
DisplayName = "My First Block",
Order = 133536,
GUID = "0f02e38a-a6e2-4333-9bd1-c61cf573d8d3",
Description = "Just an example block.",
GroupName = "Blocks.Content"
)]
public class MyFirstBlock : BaseBlock
{
[CultureSpecific]
[Display(
Name = "Title",
Order = 100,
Description = "The title",
GroupName = "Information")]
[Required]
public virtual XhtmlString Title { get; set; }
}
我使用以下正則表達式來查找值: Order: (?<=Order = )\\d{4,}(?=[,)])
GUID: (?<=GUID = \\").*(?=\\")
而這些工作,但他們有一些缺點。 對於訂單正則表達式,我不想查找至少 4 位數字。 我更願意這樣做(?<=Order = )\\d*(?=[,)])
所以如果當前訂單值小於 4 位甚至根本沒有輸入,它也會找到正確的位置。 但這也將匹配標題的顯示注釋中的順序。 我已經嘗試使表達不貪婪,就像我在谷歌搜索我的問題時找到的幾乎每個搜索結果中都接受的答案一樣,但這似乎沒有任何作用。
對於 GUID,我遇到了同樣的問題。 我不能確定文檔中的某處不會有另一個我不想替換的 GUID。 所以對於這個表達式問題基本上是一樣的,我只想找到文檔中第一個GUID的值。
我嘗試過的另一種方法是在 ContentType 塊中查找 Order 和 GUID,但我無法讓它起作用。
將這個問題放在上下文中的一些背景信息:我正在編寫一個 VS 擴展,它將根據用戶選擇的文本生成訂單號,並用新生成的 GUID 替換 GUID。 我正在使用 EnvDTE.TextDocument.ReplacePattern() 在訂單和 GUID 生成后替換它們的值。
您可以使用以下解決方案:
var result = Regex.Replace(
Regex.Replace(input, @"(?s)(\[ContentType\((?:(?!\)]).)*?\bOrder\s*=\s*)\d*(.*?\)])", "${1}<<ORDER>>$2"),
@"(?s)(\[ContentType\((?:(?!\)]).)*?\bGUID\s*=\s*""?)[\w-]*(.*?\)])",
"${1}<<GUID>>$2");
請參閱C# 在線演示,該演示顯示Order
和GUID
值僅在ContentType
部分被替換:
Order = <<ORDER>>,
GUID = "<<GUID>>",
請注意,使用花括號使替換反向引用明確無誤,因為很可能您的替換以數字開頭,這可能會創建無效的組引用。
模式匹配:
(?s)
- 啟用.
匹配換行符(\\[ContentType\\((?:(?!\\)]).)*?\\bGUID\\s*=\\s*"?)
- 第 1 組捕獲:
\\[ContentType\\(
- 一個[ContentType(
substring(?:(?!\\)]).)*?
- 任何不以)]
開頭的字符,盡可能少,\\bGUID
- 一個完整的詞GUID
(或Order
)\\s*=\\s*
- a =
用 0+ 個空格括起來"?
- 一個可選的"
[\\w-]*
- 0 個或多個單詞或-
字符(.*?\\)])
- 第 2 組:在第一個之前盡可能少的任何字符)]
包括它們。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.