簡體   English   中英

C#Regex.Split - Subpattern返回空字符串

[英]C# Regex.Split - Subpattern returns empty strings

嘿,這個令人敬畏的社區的第一次海報。

我在我的C#應用​​程序中有一個正則表達式來解析變量的賦值:

NewVar = 40

在文本框中輸入。 我希望我的正則表達式返回(使用Regex.Split)變量的名稱和值,非常簡單。 這是我到目前為止的正則表達式:

var r = new Regex(@"^(\w+)=(\d+)$", RegexOptions.IgnorePatternWhitespace);
var mc = r.Split(command);

我的目標是在正則表達式中修剪空白而不使用返回值的Trim()方法。 目前,它可以工作,但它在MatchCollection的開頭返回一個空字符串,在結尾處返回一個空字符串。

使用上面的輸入示例,這是從Regex.Split返回的:

mc[0] = ""
mc[1] = "NewVar"
mc[2] = "40"
mc[3] = ""

所以我的問題是:為什么它在開頭和結尾都返回一個空字符串?

謝謝。

共鳴RegEx.Split返回四個值是你只有一個匹配,所以RegEx.Split返回:

  • 比賽前的所有文字,即“”
  • 匹配中的所有()組,分別為“NewVar”和“40”
  • 匹配后的所有文字,即“”

RegEx.Split的主要目的是在匹配的正則表達式之間提取任何文本,例如,您可以使用帶有“[,;]”模式的RegEx.Split來分割逗號或分號上的文本。 在.NET Framework 1.0和1.1中,Regex.Split僅返回拆分值,在本例中為“”和“”,但在.NET Framework 2.0中,它被修改為還包含在Regex中與()匹配的值,這就是為什么你是看到“NewVar”和“40”。

你在尋找的是Regex.Match ,而不是Regex.Split 它會完全符合您的要求:

var r = new Regex(@"^(\w+)=(\d+)$");
var match = r.Match(command);
var varName = match.Groups[0].Value;
var valueText = match.Groups[1].Value;

請注意,RegexOptions.IgnorePatternWhitespace意味着您可以在模式中包含額外的空格 - 它與匹配的文本無關。 由於您的模式中沒有額外的空格,因此不必要。

從文檔中Regex.Split()使用正則表達式作為分隔符進行拆分。 它不會將捕獲的組從輸入字符串中分離出來。 此外, IgnorePatternWhitespace忽略模式中未轉義的空格,而不是輸入。

相反,請嘗試以下方法:

var r = new Regex(@"\s*=\s*");
var mc = r.Split(command);

請注意,空格實際上是作為分隔符的一部分使用的。

暫無
暫無

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

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