1

如何在 C# 中正确解析字符串?我有下一个模式

"|?\d+(:\d+([lLrR])?)?"

bool bV = 是否有垂直线;
然后 int iL = 数字;
跳过 ':'
然后 int iD = number;
和 bool bS = 是否有字母。

如果我用 C 语言编写,我可以自己编写如下:

char* s = str; char* s1 = str1;
if( *s == '|' ) { bV == 1; s++; }
while( isdigit (*s) )
{ *s1 = s++; s1++; } s1 = 0;
iL = itoa (str1);
// and so on..

但是在 C# 中它看起来很愚蠢。我读过String.Splitand Regex.Split,但在它工作之后我也需要写分支。我认为有更好的方法。你知道吗?


我会尽力解释。有专门用于解析的功能吗?像..

parseString(" {'|' | ''} {0} : {1} {'L'|'R'}", string, int, int, string);

像 ReadConsole 有期望数值的地方。我只是问问。框架有很多有趣的功能。

目前我尝试使用正则表达式并有这样的东西:

 {
  string pattern = @"(?<bVect>[|]?)\s*(?<iDest>\d+)(\s*:\s*(?<iLvl>\d+)*\s*(?<bSide>[LRlr]?)?)";   
  RegexOptions option = RegexOptions.IgnoreCase; 
  Regex newReg = new Regex(pattern,option);  
  MatchCollection matches = newReg.Matches(str);

  // Here starting 'Branches' = 'if-statements' I mean
  if(matches.Count != 1) { /* error */}
  bV = (matches[0].Groups["bVect"].Value == "|");
  bS = (matches[0].Groups["bSide"].Value != "");
  string ss = matches[0].Groups["iDest"].Value;
  if (ss != "")
   iD = Convert.ToInt32 (ss);
  ss = matches[0].Groups["iLvl"].Value;
  if( ss != "" )
   iL = Convert.ToInt32 (ss);
 }
4

4 回答 4

3

您可以使用[]运算符直接访问字符串的字符。从这一点开始,您可以在 C# 中使用您已经工作的 C 算法。

唯一的区别是显然你不能使用指针(除非你想使用不安全的代码,但不推荐)。因此,您也必须保留数组的索引,而不是使用指针算术。考虑这样的事情:

int index = 0;
if( s[index] == '|' ) { bV == 1; index++ }
/// and so on
于 2013-10-18T07:24:38.970 回答
2

我认为您正在寻找类似的东西:

    var sourceString = @"|?\d+(:\d+([lLrR])?)?".ToCharArray();

    int length = sourceString.Length;
    int i = 0;
    while (i < length && char.IsDigit(sourceString[i++]))
    {
        // rest of the code

    }
于 2013-10-18T07:44:58.417 回答
1

如果我理解正确,您可以将您的模式与Regex.Match(pattern, input, RegexOptions.SingleLine). 生成的Match对象有一个属性组,您可以在其中提取所需的数据。(对于第一个匹配,或使用多个 Match 结果Regex.Matches(...)来获取匹配的 ICollection。)

每个左大括号将产生一个组,因此您应该在垂直线和您感兴趣的所有组周围添加大括号: (|)?(\d+)(:(\d+)([lLrR])?)?

现在if match.Success,您将获得:

/* match.Groups[0] is the whole match. */
bool bV = match.groups[1].Success;
int iL = int.Parse(match.groups[2].Value);
int iD = int.Parse(match.groups[4].Value);
bool bS = match.groups[5].Success;
于 2013-10-18T11:49:42.897 回答
0

为什么不使用正则表达式命名的捕获组?

于 2013-10-18T07:39:35.547 回答