簡體   English   中英

在c#中使用Regex在字符串上拆分標記

[英]Split tokens on string using Regex in c#

我有一些“標記化”模板,例如(我稱之為雙括號之間的標記 ):

var template1 = "{{TOKEN1}} is a {{TOKEN2}} and it has some {{TOKEN3}}";

我想從這句話中提取一個數組,以便有類似的東西:

Array("{{TOKEN1}}",
      " is a ",
      "{{TOKEN2}}", 
      " and it has some ", 
      "{{TOKEN3}}");

我已嘗試使用以下Regex代碼實現此目的:

Regex r = new Regex(@"({{[^\}]*}})");
var n = r.Split(template1);

結果是:

Array("",
      "{{TOKEN1}}",
      " is a ",
      "{{TOKEN2}}", 
      " and it has some ", 
      "{{TOKEN3}}",
      "");

第一個問題是我無法從句子中恢復令牌。 我只是通過在Regex表達式上添加括號來解決這個問題,即使我不確定為什么它會解決這個問題。

我目前面臨的問題是當模板上的第一個和/或最后一個術語是“令牌”時,數組開頭和/或末尾的額外空術語。 為什么會這樣? 我做錯了什么,或者我應該經常檢查這兩個位置是否空虛?

在我的代碼中,我需要知道哪個術語來自一個令牌,哪個是模板上的固定位置。 在這個解決方案中,我將檢查每個數組的位置,以“{{”和“}}”開頭的字符串,我不認為這是最好的可能性。 所以,如果有人想出一個更好的解決方案來打破這些事情,我會很高興知道!

謝謝!

編輯:根據要求,我將發布一個簡單的例子,為什么我需要對令牌和文本進行區分。

public abstract class TextParts { }
public class TextToken : TextParts { }
public class TextConstant : TextParts { }

var list = new List<TextParts>();
list.Add( new TextToken("{{TOKEN1}}") );
list.Add( new TextConstant(" is a ") );
list.Add( new TextToken("{{TOKEN2}}") );
/* and so on */

這樣,我將有一個組成我的字符串的部分列表,我將能夠在我的數據庫上記錄它,以便將來操作和替換。 實際上,每個TOKEN都將被Regex字符串取代。

目標是用戶將能夠輸入諸如“{{SERVER}}沒有正在偵聽端口{{PORT}}”之類的消息,並且我將能夠將“{{SERVER}}”替換為[a-zA-Z0-9 ]+和“{{PORT}}”到\\d{1,5} 說得通?

我希望這會使帖子更加清晰。

如果沿分隔符拆分字符串,並且字符串以分隔符開頭或結尾,則表示在第一個/最后一個分隔符之前/之后有一個空元素:

想象一下CSV文件中的以下行:

,a,b,c,

該CSV行包含元素"""a""b""c"""

您的{{TOKEN}}發生同樣的事情。 您可以使用其他方法:

MatchCollection allMatchResults = null;
Regex regexObj = new Regex(@"\{\{[^{}]*\}\}|[^{}]+");
allMatchResults = regexObj.Matches(subjectString);

如果在標記內或標記之間可能出現單個括號,您也可以使用

Regex regexObj = new Regex(@"\{\{(?:(?!\}\}).)*\}\}|(?:(?!\{\{).)+");

但是,由於所有前瞻性斷言,效率會低一些,所以只有在需要時才應該使用它。

編輯:我剛剛注意到你的帖子中還有另一個問題:為什么你需要在正則表達式周圍添加括號以使其“正常”? 答:通常, split()命令僅返回分隔符之間的內容。 如果將分隔符(或其中的一部分)括在捕獲括號中,則這些括號內匹配的內容也將添加到結果列表中。

嘗試這種模式,它會將你的標記作為匹配。

\b*\{{2}\w+\}{2}\b*

暫無
暫無

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

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